webForumDet fria alternativet

Bit-operator

C/C++

3 svar · 973 visningar · startad av Zebras

Medlem sedan feb. 20132 inlägg
Frågan#1

Hej!

Jag skulle behöva hjälp med varför man använder sig av n >> c i denna kodsnutten.
Jag förstår att den flyttar bitarna, men varför?

#include <stdio.h>

int main()
{
	int n, c, k;

	printf("Enter an integer in decimal number system\n"); 
	scanf("%d", &n); 

	printf("%d in binary number system is:\n", n);

	for (c = 10; c >= 0; c--) 
	{
		k = n >> c; 
		if (k & 1) /
		printf("1"); 
	else
	printf("0"); 
	}

	fflush(stdin);
	getchar();
return 0;
}
Medlem sedan aug. 20039 340 inlägg
#2

Hej. Skiftningen går ut på att välja ut en bit från numret. Först skiftas hela numret till höger så att biten du vill titta på hamnar i bit 0 (biten längst till höger) sedan and-as resultatet med 1, som har biten längst till höger satt, så att bara den biten plockas ut. Säg till exempel att du matar in 328. Binärt blir det 00101001000. Loopen går från 10 och neråt till noll. Då sker följande:

n = 00101001000

Loopen börjar.
c = 10(decimalt)
[b][u]0[/u][/b]0101001000 n
0000000000[b][u]0[/u][/b] k = n >> c
0000000000[u]1[/u] 1
0000000000[u]0[/u] k & 1

c = 9 (decimalt)
[b]0[u]0[/u][/b]101001000 n
000000000[b]0[u]0[/u][/b] k = n >> c
0000000000[u]1[/u] 1
0000000000[u]0[/u] k & 1

c = 8 (decimalt)
[b]00[u]1[/u][/b]01001000 n
00000000[b]00[u]1[/u][/b] k = n >> c
0000000000[u]1[/u] 1
0000000000[u]1[/u] k & 1

c = 7 (decimalt)
[b]001[u]0[/u][/b]1001000 n
0000000[b]001[u]0[/u][/b] k = n >> c
0000000000[u]1[/u] 1
0000000000[u]0[/u] k & 1

c = 6 (decimalt)
[b]0010[u]1[/u][/b]001000 n
000000[b]0010[u]1[/u][/b] k = n >> c
0000000000[u]1[/u] 1
0000000000[u]1[/u] k & 1

c = 5 (decimalt)
[b]00101[u]0[/u][/b]01000 n
00000[b]00101[u]0[/u][/b] k = n >> c
0000000000[u]1[/u] 1
0000000000[u]0[/u] k & 1

c = 4 (decimalt)
[b]001010[u]0[/u][/b]1000 n
0000[b]001010[u]0[/u][/b] k = n >> c
0000000000[u]1[/u] 1
0000000000[u]0[/u] k & 1

c = 3 (decimalt)
[b]010100[u]1[/u][/b]000 n
00[b]0010100[u]1[/u][/b] k = n >> c
000000000[u]1[/u] 1
000000000[u]1[/u] k & 1

c = 2 (decimalt)
[b]0101001[u]0[/u][/b]00 n
00[b]0101001[u]0[/u][/b] k = n >> c
000000000[u]1[/u] 1
000000000[u]0[/u] k & 1

c = 1 (decimalt)
[b]01010010[u]0[/u][/b]0 n
0[b]01010010[u]0[/u][/b] k = n >> c
000000000[u]1[/u] 1
000000000[u]0[/u] k & 1

c = 0 (decimalt)
[b]010100100[u]0[/u][/b] n
[b]010100100[u]0[/u][/b] k = n >> c
000000000[u]1[/u] 1
000000000[u]0[/u] k & 1

Bara för att vara övertydlig. n >> c flyttar bitarna åt höger. De bitar som skiftas ut kastas bort. På vänstersidan fylls talet på med nollor.
Fetmarkering = de bitar som "överlever" skiftningen, dvs varken skiftas ut eller är nya nollor.
Understruket = den biten som undersöks i den rotationen av loopen.

För övrigt. En något tänkvärt är att högerskiftning i x steg är samma sak som heltalsdivision med 2, x st gånger.
T ex, n>>2 = n/4 (=n/2/2)
och n>>4 = n/16 (=n/2/2/2/2)

(edit)

Medlem sedan feb. 20132 inlägg
#3

Tacktack!

Akrivera eller radera :)

Medlem sedan aug. 20039 340 inlägg
#4

Ingetdera. Däremot kan du själv markera ett svar som lösning med länken ovanför inlägget. (Fast nu gör jag det istället.)

254 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
126 ms — hämta tråd, inlägg och bilagor (db)
120 ms — ändringar (db)