Ich verstehe die shift-Operatoren nicht
-
Hallo.
In einem Code kommt Folgendes vor:
unsigned int lower_bound = 0; unsigned int upper_bound = myvec.size()-1; unsigned int i = ((upper_bound - lower_bound) >> 1) + lower_bound;Was tut dieses Codefragment und wozu ist die Bitmanipulation hier gut? Das ">>" ist soweit ich richtig kenne, der bitweise recht-shift, aber was hat man davon?
-
Eine Division durch 2. Man hätte das besser auch als
/2geschrieben, das ist klarer und es kommt der gleiche Maschinencode raus.
-
Und was macht der Operator ">>"???
-
Er schiebt Bits nach rechts. Ein Schieben einer vorzeichenlosen ganzen Zahl um N Bits nach rechts entspricht einer Division durch $$2^N$$ (gefolgt von Abrunden auf die nächstniedrigere ganze Zahl).
-
EDIT: Und ergänzend: schiebst du nach links, multiplizierst du mit 2n (wie du dir vermutlich denken kannst).
Hier gibts auch was zu lesen:
http://de.wikipedia.org/wiki/Bitweiser_Operator#Bitweise_Verschiebungen
-
_matze schrieb:
EDIT: Und ergänzend: schiebst du nach links, multiplizierst du mit n2 (wie du dir vermutlich denken kannst).
Also ich kann mir vermutlich denken, daß das nicht stimmt.
-
Belli schrieb:
_matze schrieb:
EDIT: Und ergänzend: schiebst du nach links, multiplizierst du mit n2 (wie du dir vermutlich denken kannst).
Also ich kann mir vermutlich denken, daß das nicht stimmt.
Hehe, ja schon gut. Ich meine natürlich 2n.

-
Hey Leute, Danke für eure Hilfe. Ich finds nur komisch, warum die das nicht gleich mit dem %-Operator gemacht haben, weil hier N immer 1 ist...
Vielen Dank!
-
Weil ein Prozessor schneller shiften als dividieren kann. Sie bedenken dabei aber nicht, dass der Compiler sowieso für beide Varianten denselben Maschinencode, in dem der Wert geshiftet wird, erzeugt.
-
_matze schrieb:
Belli schrieb:
_matze schrieb:
EDIT: Und ergänzend: schiebst du nach links, multiplizierst du mit n2 (wie du dir vermutlich denken kannst).
Also ich kann mir vermutlich denken, daß das nicht stimmt.
Hehe, ja schon gut. Ich meine natürlich 2n.

