ZebrasMedlem sedan feb. 20132 inlägg
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;
}
nitro2k01Medlem sedan aug. 20037 630 inlägg
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)
ZebrasMedlem sedan feb. 20132 inlägg
Tacktack!
Akrivera eller radera :)
nitro2k01Medlem sedan aug. 20037 630 inlägg
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.)