001
12.05.2004, 17:38 Uhr
Pablo
Supertux (Operator)
|
x>>1 bedeutet bits nach rechst shiften. Ein Register (sagen wir mal ein 8-bit Register) hat 8 Bits. Das kannst du dir als ein Stapel vorstellen, wobei unten (oder links) die niederwertigsten Bits und oben (oder echts) die höherwertigsten Bits sind.
Eine Shift Operation verschiebt alle Bits, entweder nach Links oder nach Rechts. Angenommen: x=10001101 wird x>>1 ist 01000110. Sieht du den Unterschied? Der ganze Block wurde um eine Stelle nach rechts verschoben, und die neuen Stellen werden mit 0 gefüllt. Die letzte 1 von der 1 geht in diesem Fall verloren.
D.h., wenn du (im meinem Beispiel) 8 mal nach rechts shiftest, dann bekommst die zahl 0, denn dann hätte dein Register 00000000, denn jedesmal, dass es nach rechts verschoben wird, erschient ganz rechts eine 0, d.h. in höchstens 8 Schritten haben wir eine 0.
x>>=1 ist äquivalent zu x=x>>1, d.h. weise in x den Wert von "x nach rechts geschifftet" zu. Es ist logisch, dass x irgendwann 0 sein wird, wenn das passiert, kommen wir von der For Schleige raus, das x!=0 FALSE liefert.
x&1 bedeutet, vergleiche alle Bits von x mit der 1 mit dem Operator AND. Du weißt, dass
Code: |
x | y | x&y --------------- 0 | 0 | 0 --------------- 0 | 1 | 0 --------------- 1 | 0 | 0 --------------- 1 | 1 | 1
|
Das heißt, dann x&1 ist äquivalnet zu x&00000001. Angenommen x=11001101. Dann ist x&1
Code: |
1 1 0 0 1 1 0 1 0 0 0 0 0 0 0 1 ------------------------ & 0 0 0 0 0 0 0 1 = 1 im Dezimalsystem.
|
if (x&1) bedeutet, wenn x AND 1 eine 1 liefert, dann gibt es an der 0. Stelle eine 1, also b++ (b ist der Zähler). Dieser Trick heißt Maskierung, damit kannst du enzelne Bits eine Binäerzahl herausfinden.
Bsp: x=00000101 = 5 Wenn ich wissen will, ob das 3. Bit von den 8 Bits gesetzt, mache ich folgendes if (x&4==4) ==> durch die Maskierung bekomme ich 00000100=4 Oder if (x&8==0) ==> das 4. Bit ist nicht gesetzt, also 0 (in unserem Bespiel würde x&8==0 TREU liefern) -- A! Elbereth Gilthoniel! silivren penna míriel o menel aglar elenath, Gilthoniel, A! Elbereth! Dieser Post wurde am 12.05.2004 um 17:43 Uhr von Pablo editiert. |