Zamiana liczby dziesiętnej na dwójkowy.

0

Witam,

Z uwagi na to, że to mój pierwszy post pragnę się przywitać ;)
Zaczynam po mału przygodę z c++, jestem w trakcie czytania symfoni c++ standard i równolegle próbuję sobie coś tam pisać w celu lepszego przyswojenia wiedzy.

Próbuje napisać prosty programik do obliczania adresu sieci oraz broadcast na podstawie podanego adresu oraz maski. Wczoraj spędziłem niemal cały dzień nad tym aby przerobić wprowadzony adres IP na postać dwójkową..
Udało mi się to zrealizować ale jak się dziś okazało, zrobiłem to bardzo nieelegancko bardzo dużo kodu a okazuje się że za pomocą kilku prostych trików można to zrobić dużo prościej. Wybaczcie ale nie będę się chwalił jak to zrobiłem, natomiast przedstawię tutaj rozwiązanie jakie znalazłem dziś w sieci. Nie rozumiem w nim pewnej rzeczy.

#include <stdio.h>

int main(){
   int i,j,liczba[4];
   char bin[4][9];
   printf("podaj adres ip:\t");
   scanf("%d.%d.%d.%d",&liczba[0],&liczba[1],&liczba[2],&liczba[3]);
   for(j=0;j<4;++j){
       for(i=7;i>-1;--i){
           bin[j][i]=(char)((liczba[j]&1)+48);
           liczba[j]=liczba[j]>>1;
       }//for
       bin[j][8]=0;
   }

   printf("%s.%s.%s.%s\n",bin[0],bin[1],bin[2],bin[3]);
   getchar();
}

Jak wiadomo aby uzyskać postać binarną liczby dziesiętnej dzieli się ją przez 2 i na podstawie tego czy jest reszta lub nie zapisuje się 1 lub 0.

Ten program podobno też tak to robi ale nie kumam tego co się tutaj dzieje: bin[j][i]=(char)((liczba[j]&1)+48);
Faktycznie na w zależności od tego jaka jest liczba czy sie dzieli czy nie daje to 1 albo 2.
Może ktoś prosto wyjaśnić co się tutaj dzieje??

Druga sprawa liczba[j]=liczba[j]>>1; jak się domyślam operator >> powoduje przesunięcie bitowe o jedno miejsce ale poco??

Ta instrukcja scanf("%d.%d.%d.%d",&liczba[0],&liczba[1],&liczba[2],&liczba[3]); bardzo upraszcza sposób wczytania do poszczególnych elementów tablicy poszczególnych bloków adresu IP.
Z tym mi wczoraj zeszło sporo czasu:)

Czytałem dziś, że scanf jest "jakby" odpowiednikiem cin i często te dwa polecenia można stosować zamiennie.
Czy za pomocą std::cin można zrealizować to samo co scanf("%d.%d.%d.%d",&liczba[0],&liczba[1],&liczba[2],&liczba[3]); ???

0
  1. Na pewno Symfonia C++ Standard kazała ci dołączyć plik stdio.h?
  2. Operator & przyjmujący dwa operandy to bitowe and.
    Załóżmy, że mamy dowolną liczbę na której stosujemy and 1.
    1 ma zapalony tylko najmłodszy bit, więc wszystkie inne bity poza nim będą wyzerowane. A wartość tego najmłodszego bitu będzie zależeć od tego czy w naszej liczbie na tym miejscu będzie występować 1 czy 0. I w gruncie rzeczy właśnie to chcemy otrzymać. A raczej nie to, tylko znak '0' lub '1'. A to jest nic innego jak liczba, kod ASCII tych znaków. Wykorzystamy tutaj fakt, że '1' jest zaraz po '0' i do wartości znaku '0' (czyli 48) dodamy 0 lub 1.
  3. Przesuwamy, żeby najmłodszym bitem, którego będziemy zaraz badać był kolejny bit.
  4. Tak, można. Zadeklaruj sobie jakąś zmienną (typ char), do której będziemy sczytywać separatory (kropki) i wystarczy zrobić std::cin >> liczba1 >> separator >> liczba2 >> separator itd.
0

Chyba już zakumałem o co chodzi ;) Dziękuję...

1 użytkowników online, w tym zalogowanych: 0, gości: 1