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


  • Mod

    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<<b
    

    verschiebt das Bitmuster von a um b Stellen nach links.

    Ein Beispiel: a=3, b=2.
    Bitmuster von a: 0011
    Um zwei Stellen verschoben: 1100

    Und 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: 1100

    wä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 << i
    

    Die 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 & muster
    

    Das 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.


  • Mod

    rumcajs007 schrieb:

    Ein Beispiel: a=3, b=2.
    Bitmuster von a: 0011
    Um zwei Stellen verschoben: 1100

    wä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.


Anmelden zum Antworten