[ nenadnesta @ 12.07.2010. 17:19 ] @
evo jednog kratkog programa koji treba da prikaze zadati broj velicine 4 bajta, bajt po bajt pocevsi od bajta najmanje tezine:

#include <stdio.h>
#define MASKA 0xff
main()
{ int i;
long broj;
printf("\nBroj u heksadecimalnom obliku?");
scanf("%lx", &broj);
for(i=0;i<4;i++)
printf( "\n%#x", ( broj >> (8*i)) & MASKA );
}

program je korektan tj.radi a ja bih voleo da neko prokomentarise naredbu ( broj >> (8*i)) & MASKA )
naime, broj velicine 4B se prvo pomera udesno zbog veceg prioriteta a zatim se izvodi operacija & (logicko I) broja velicine 4B i maske velicine 1B, zasto je konacan rezultat ove naredbe broj velicine 1B? ako moze neko da objasni kroz brojevni primer !


[ Picsel @ 13.07.2010. 22:53 ] @
Uzmimo da je broj koji unosimo velicine 4 bajta i neka je to recimo 2A35CD87.
Binarno je to
00101010001101011100110110000111

Maska je FF, odnosno binarno 11111111. Ovaj broj se posmatra kao 4 bajta, zato sto je dat kao konstanta, a brojne konstante se interpretiraju kao brojevi od 4 bajta (da je tipa char, odnosno velicine 1 bajt, prica bi bila malo drugacija i program ne bi korektno radio). Kad posmatramo ovaj broj kao 4 bajta, to je 000000FF, sto je binarno
00000000000000000000000011111111

Bitwise AND poredi dva bita na istoj poziciji (i to radi za sve 32 pozicije 4-bajtnog broja). Ukoliko su oba bita 1, vrednost je 1, inace je 0.

1. korak iteracije - uneti broj se pomera za 0 mesta u desno i zatim se radi bitwise AND izmedju tog broja i maske
Code:

00101010001101011100110110000111
00000000000000000000000011111111
------------------------------------
00000000000000000000000010000111


Dobijeni rezultat se poklapa sa poslednjim bajtom (poslednjih 8 bitova), jer ove nule u maski rezultuju nulama u resenju.

2. korak iteracije - uneti broj pomera se za 8 mesta u desno, dok se na prvih 8 mesta dodaje 8 nula
Code:

00000000001010100011010111001101
00000000000000000000000011111111
------------------------------------
00000000000000000000000011001101


3. korak iteracije - kao prethodni, samo sto se pomera za 16 pozicija i dodaje se 16 nula
Code:

00000000000000000010101000110101
00000000000000000000000011111111
------------------------------------
00000000000000000000000000110101


4. korak iteracije
Code:

00000000000000000000000000101010
00000000000000000000000011111111
------------------------------------
00000000000000000000000000101010


Sam rezultat ove operacije nije velicine 1 bajt, vec 4 bajta, ali nule u prva tri bajta ne uticu na rezultat, odnosno, isti je broj. Printf ne ispisuje vodece nule kod heksadecimalnih brojeva, kao sto ne ispisuje ni kod decimalnih.

[Ovu poruku je menjao Picsel dana 14.07.2010. u 00:06 GMT+1]

[Ovu poruku je menjao Picsel dana 14.07.2010. u 00:07 GMT+1]
[ nenadnesta @ 15.07.2010. 15:50 ] @
tako jasan i dobar odgovor .
Hvala puno !