bit operator/operation '<<'
-
hallo. hab eine anfängerfrage obwohl ich nicht wirklich anfänger bin

es geht um darstellung einer dec zahl als eine bit zahl....
und ich verstehe nicht ganz folgende zeile :
if([b]zahl & (1 << i)[/b]) {cout << "1";} else {cout << "0";}mit << folgt eine verschiebung der bits um eine stelle von zahl an der pos. i ja ? dabei ist die 1 nur zum vergleich da und nicht um die verschiebung um eins anzugeben...
und warum funktioniert das nicht ?
if([b]zahl & (0 << i)[/b]) {cout << "0";} else {cout << "1";}könnte jemand mal eine plausible erklärung geben, danke im vorraus

-
rumcajs007 schrieb:
und warum funktioniert das nicht ?
if([b]zahl & (0 << i)[/b]) {cout << "0";} else {cout << "1";}könnte jemand mal eine plausible erklärung geben, danke im v******

was fkt daran nicht? allerdings können wir es ja mal hier durchgehen:
if(zahl & 0)
->
if(0)bb
-
rumcajs007 schrieb:
mit << folgt eine verschiebung der bits um eine stelle von zahl an der pos. i ja ? dabei ist die 1 nur zum vergleich da und nicht um die verschiebung um eins anzugeben...
Da hast du nicht richtig verstanden, was << macht:
a<<bverschiebt das Bitmuster von a um b Stellen nach links.
Ein Beispiel: a=3, b=2.
Bitmuster von a: 0011
Um zwei Stellen verschoben: 1100Und wie du nun sicher siehst, ist es sehr wichtig, ob da 1 oder 0 steht, denn 0<<i ist immer 0 und 1<<i ist immer von Null verschieden (Es gilt sogar, dass 1<<i die i-te Potenz von 2 ist. Dies ist ein zentraler Punkt deines Beispielprogramms).
edit: Tippfehler im Beispiel korrigiert.
-
verstehe nmicht ganz was du jetzt meinst, jedenfalls soll die 1 doch die verschiebung andeuten, um eine stele anscheind...
wollte eigentlich wissen was die zeile zahl & (0 << i) bedeutet.
danke

-
und was ist dann mit a<<=b ?
-
Ein Beispiel: a=3, b=2.
Bitmuster von a: 0011
Um zwei Stellen verschoben: 1100wäre richtg oder :p
-
so, man könnte es auch so formulieren :
zbsp.
if(7 & (1 << i))
{cout << "1";}else
{cout << "0";}7 entspricht 0111 ...
bei i=3 ist eine null da somit kommt ne 0 raus da 0 ≠ 1 sei ...
bei i=2,1,0 eine eins (1==1) also kommen da einser raus.ausgabe : 0111
korrekt ?
-
rumcajs007 schrieb:
verstehe nmicht ganz was du jetzt meinst, jedenfalls soll die 1 doch die verschiebung andeuten, um eine stele anscheind...
Nein, nein, nein. Die 1 wird verschoben. Nehmen wir den Ausdruck mal auseinander:
zahl & (1 << i)Zuerst wird die Klammer ausgeführt:
1 << iDie Bits der Repräsentation der Zahl 1, bei einer 4-Bit-Zahl also 0001, werden um i Stellen nach links verschoben, also für i = 3 z. B. 1000. Somit erhälst du folgende Werte:
i 1 << i 0 1 1 2 2 4 3 8 4 16 usw.Nennen wir 1 << i mal muster. Nehmen wir nun den ganzen Ausdruck, der sich dann vereinfacht zu
zahl & musterDas bitweise Und setzt genau dann das Ergebnisbit auf 1, wenn beide Eingangsbits 1 sind. Da bei muster immer nur ein Bit gesetzt sit, ergibt der ganze Ausdruck zahl & muster nur dann nicht 0, wenn das entsprechende Bit von zahl auch gesetzt ist.
Beispiel: zahl = 1011
i = 0: 1011 & 0001 = 0001 => true (1) i = 1: 1011 & 0010 = 0010 => true (1) i = 2: 1011 & 0100 = 0000 => false (0) i = 3: 1011 & 0100 = 1000 => true (1)Du siehst also, dass man, wenn man die Ergebnisse der if-Abfragen von unten nach oben liest, die einzelnen Bits von zahl erhält.
-
rumcajs007 schrieb:
Ein Beispiel: a=3, b=2.
Bitmuster von a: 0011
Um zwei Stellen verschoben: 1100wäre richtg oder :p
Ja, war ein Tippfehler meinerseits.
-
ja gut, jetzt leuchtets ein...
vielen dank nochmal an alle klärenden, speziell an Michael
gruss.