Odjechani.com.pl

Pełna wersja: Program do zamieniania liczb dziesiętnych na binarne
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Stron: 1 2
Siemaneczko ostatnio dużo siedzę w C++'sie napisałem program konsolowy do zamiany liczb dziesiętnych na binarne.
Mam w nim kawałem kodu z neta, ale potrzebowałbym lekkiego nakierowania jak ten kawałek kodu przetłumaczyć na ludzki język.
Mianowicie chodzi mi o ten kawałek:


	/*Wpisana liczba na binarke*/
			for (int i=16;i>=0; i--){
				cout << (liczba&(1<<i)?1:0);
			
			}
1 linijkę pod komentarzem rozumiem chodzi mi bardziej o 2 linijkę w dół od kometarza (czyli to: cout << (liczba&(1<<i)?1:0); )



Mógłby mi ktoś w jasny sposób powiedzieć co w tym przypadku robi znak & i ? oraz w jaki sposób zinterpretować to - (1<<i).
z góry dzięki za pomoc. Tutaj kod całego programu (pisany w C++)


#include <iostream>
#include <cstdlib>>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char** argv) {
	

	int liczba,wybor;
	
	
			/*Początek programu*/
		Poczatek:
			
		
			/*Czyszczenie ekranu*/
		system ( "cls" );
			/*INFORMACJA*/
		cout << "Wpisz liczbe ktora chcesz zamienic na binarna: " << endl;
		cin >> liczba;
		cout << endl;
		cout << "Liczba " << liczba << " po zamianie to:" << endl;
		cout << endl;
	
	
			/*Wpisana liczba na binarke*/
			for (int i=16;i>=0; i--){
				cout << (liczba&(1<<i)?1:0);
			
			}
		cout << endl;
	
	
			/*menu*/
		cout << "Poczatek [1] Wyjscie [2] " << endl;
		cin >> wybor;
	
	
			/*instrukcja warunkowa*/
			if ( wybor == 1 )
				goto Poczatek;
			else
				{
				/*Koniec programu*/
				system( "cls" );
				cout << "Zakonczenie programu. Nacisnij dowolny klawisz aby wyjsc" << endl;
				}
				
								}
Jeśli dobrze pamiętam, to liczba&1 wyświetla ostatni bit liczby, & to jest symbol iloczynu bitowego, a << lub >> przesuwa wyświetlany bit o jedną pozycję w lewo lub prawo. W twoim wypadku jest jeszcze argument?a:b i działa to na tej zasadzie, że "argument" jest warunkiem, jeśli ten warunek jest spełniony wyświetla się "a", jeśli nie, wyświetla się "b".
W pętli masz 16, co zapewne stosuje się do tego, że korzystasz z 16 bitów maksymalnie. Nie przyglądałem się, Twojemu kodowi, tylko temu fragmentowi.

Ja bym po prostu wyświetlił resztę z dzielenia przez dwa do otrzymania ciągu w systemie binarnym zapisując resztę po kolei w tablicy, a potem wyświetlając tablicę w całości od końca.

Np.

46=1 0 1 1 1 0 bo 46/2=23 reszta 0; 23/2=11 reszta 1;11/2=5 reszta 1; 5/2=2 reszta 1; 2/2=1 reszta 1; na końcu zawsze 1; Czyli od końca 1 0 1 1 1 0
Dzięki wielkie za wytłumaczenie teraz więcej z tego kminię. :) Z tą resztą z dzielenia pokombinuję - Ćwiczenie czyni mistrza. :D

(30.01.2016, 03:45)Swordancer napisał(a): [ -> ]potem wyświetlając tablicę w całości od końca.
Mam pytanie jak to zrobić?
No i mam problem z napisaniem pętli z instrukcją warunkową.
napewno musiałbym zacząć od pętli
for (int i=16;i>=0; i--) {
         if ( liczba%2 != 0 )
            cout << "0";
         else if ( liczba%2 == 0 )
            cout << "1";
         else 
             cout << " blad ";
}
I na tym skończyły mi się pomysły w prawdzie wyświetla 0 czy 1, ale jest to cała ich seria. Na pewno muszę dać przesunięcie bitu, ale gdzie? Mógłby ktoś pomóc?
int i=0,bity[16];
 
  while(liczba)
  {
    bity[i++]=liczba%2;
    liczba/=2;
  } 
 
  for(int j=i-1;j>=0;j--)
    cout<<bity[j];
}

Prosta sprawa.
Ja jednak zostanę przy mojej wersji. Poczytałem trochę i wyjaśniło się sporo. Łatwiej mi jest go napisać.
Nie rozumiem co w większości twojego kodu oznacza j.
No j pomniejszone o 1 do wyświetlenia odpowiedniego znaku z tablicy po kolei w pętli.


#include "stdafx.h"
#include <cstdlib>
#include <iostream>
using namespace std;

int main()
{
	int liczba;
	cout << "Podaj liczbę: ";
	cin >> liczba;

	int i = 0, tab[16];

	while (liczba)
	{
		tab[i++] = liczba % 2;
		liczba /= 2;
	}

	for (int j = i - 1; j >= 0; j--)
          cout << tab[j];
	     cout << endl;

       system("pause");
       return 0;
}

Banalnie prosty i działa, prawda? Tablicę można zwiększyć, by wchodziły większe liczby.
Powtórzę pytanie - Co w większości twojego kodu oznacza litera J :)
"J" to licznik pętli odpowiedzialnej za wyświetlanie kolejnych cyfr wyliczonej liczby binarnej. Każda cyfra w wyliczonej liczbie binarnej jest przechowywana w jednej komórce tablicy "tab". Aby wyświetlić liczbę binarną, trzeba odczytywać cyfry z tablicy od tyłu, stąd "j--"-czyli przechodzenie do wcześniejszej komórki tablicy. Odczyt trzeba zacząć od ostatniej komórki tablicy gdzie jest pierwsza cyfra stąd "j = i - 1". Pierwszy indeks tablicy gdzie jest ostatnia liczba ma indeks zero stąd "j >= 0".
No dokładnie to napisałem, tylko, że w skrócie i pomyliłem się pisząc "i" zamiast "j" w poprzednim poście, już to poprawiłem. Przecież to oczywiste, że jak zapisuje w tablicy poszczególne bity wynikające z dzielenia przez dwa, to muszę je od końca wyświetlić z tej tablicy przy pomocy pętli.
Być może oczywiste, ale wiesz dopiero zaczynam. Lepiej się dopytać i douczyć jak być całe życie głupkiem. :3
Stron: 1 2