Pomoc w zrozumieniu przesunięcia bitowego.

0

Witam,
mam za zadanie napisać program, który konwertuje liczbę decymalną na binarną (przy użyciu osobnej funkcji).
Z pomocą przyszedł mi oczywiście internet i uzyskałem taki kod:

#include <stdio.h>
#include <conio.h>

int NaBin(int x){
	int n=x,k,c;
	for (c = 31; c >= 0; c--)
	 {
    k = n >> c;
 
    if (k & 1)
      printf("1");
    else
      printf("0");
	 }
 
	printf("\n");

}

int main(){
	int a;
	printf("Prosze podac liczbe: ");
	scanf("%d",&a);
	NaBin(a);
	getchar();
	getchar();
	//program do konwersji liczby decymalnej na binarną
} 

Problem w zrozumieniu tego przesunięcia bitowego.
Dlaczego 31 (czy dlatego że rozmiar int to 32bity?)
Bardzo potrzebowałbym objaśnienia: "k =n>>c".
Oczywiście cała reszta zrozumiała, tak więc jedyne na czym mi zależy to na przykładzie jak program działa po kolei z tym przesunięciem i dlaczego.
Prosiłbym o bardzo szczegółowe wyjaśnienie, ponieważ muszę dokładnie zrozumieć jak to działa.
Najlepiej zawsze przemawiają do mnie przykłady, typu: 0100 zmienia się na 0010 itp.

0

Może tak lepiej zrozumiesz:

int NaBin(int x)
  {
   int c;
   for(c=31;c>=0;--c) putchar('0'+((x&(1<<c))!=0));
   printf("\n");
  }
0

Dlaczego 31 (czy dlatego że rozmiar int to 32bity?)
Tak. Choć to nie zawsze prawda, zależy od tego ilobitowy jest system.

Weźmy liczbę 4-bitową bo nie chce mi się 32 bitów wypisywać. Masz powiedzmy liczbę 9, w komputerze jest trzymana jako 1001
Dla c == 3: 1001 >> 3 daje 1, 1 & 1 true, wypisuje 1
Dla c == 2: 1001 >> 2 daje 10, 10 & 1 false, wypisuje 0
Dla c == 1: 1001 >> 1 daje 100, 100 & 1 false, wypisuje 0
Dla c == 0: 1001 >> 0 daje 1001, 1001 & 1 true, wypisuje 1

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