Matthias Bo: Bitweise Operatoren

Hallo zusammen..
Ich habe mal eine Frage zum Bitweisen Programmieren. Es geht darum, dass ich keine Lösung dafür finde ein Bestimmtes Bit in einem Binären Ausdruck zu Ändern.

Beispiel:
Dezimal 5 wäre in Binärer Schreibweise 0101
Wie kann ich jetzt mit das zweite Bit auf 1 setzen ohne die anderen zu Ändern?

Wenn ich die Bits nach links oder rechts verschiebe, werden ja alle verschoben. Ich will aber eigentlich nur das eine Bit ändern. Gibt es eine Möglichkeit einfach nur den Wert 0 oder 1 an eine bestimmte Stelle in einem Binären Ausdruck zu schieben?

Vielen Dank für eine Antwort.

  1. Hello,

    Gibt es eine Möglichkeit einfach nur den Wert 0 oder 1 an eine bestimmte Stelle in einem Binären Ausdruck zu schieben?

    ODER dürfte klappen...
    0101 OR 0010 = 0111

    MfG
    Rouven

    --
    -------------------
    Inter Arma Enim Silent Leges  --  Cicero
    1. Hallöchen,

      ODER dürfte klappen...
      0101 OR 0010 = 0111

      das sollte klappen, stimmt. Allerdings suche ich nach einer Möglichkeit nur ein bestimmtes Bit zu bearbeiten. Das heisst, ich würde gern ein bestimmtes Bit prüfen und anschliessend ändern. Deine Möglichkeit würde ja voraussetzen, dass ich vorher weiss, ob das Bit gesetzt ist oder nicht, wenn ich das richtig sehe. Gibt es dafür auch eine Möglichkeit?

      Viele Grüße

      1. Hi,

        ODER dürfte klappen...
        0101 OR 0010 = 0111
        das sollte klappen, stimmt. Allerdings suche ich nach einer Möglichkeit nur ein bestimmtes Bit zu bearbeiten. Das heisst, ich würde gern ein bestimmtes Bit prüfen und anschliessend ändern.

        Deine Möglichkeit würde ja voraussetzen, dass ich vorher weiss, ob das Bit gesetzt ist oder nicht, wenn ich das richtig sehe.

        Ich denke du siehst es falsch. Mit "OR 0010" setzt du immer genau das vorletzte Bit, alle anderen bleiben unveraendert. Fuer das letzte Bit muesstest du dann eben "OR 0001" verwenden, usw ...

        Um zu wissen ob das entsprechende Bit vorher gesetzt war koenntest du die Ausgangszahl mit dem Ergebnis der OR-Operation vergleichen.

        mfG,
        steckl

  2. echo $begrüßung;

    Ich habe mal eine Frage zum Bitweisen Programmieren. Es geht darum, dass ich keine Lösung dafür finde ein Bestimmtes Bit in einem Binären Ausdruck zu Ändern.

    Bit setzen (wurde schon genannt):

    xxxx
    OR  0010
    =   xx1x

    Bit löschen:

    xxxx
    AND 1101
    =   xx0x

    Bit testen:

    xxxx
    AND 0010
    =   00x0  Wenn das Ergebnis 0 ist, war das Bit nicht gesetzt, ansonsten ist es größer als 0.

    echo "$verabschiedung $name";

    1. Tag,

      Bit setzen (wurde schon genannt):

      xxxx
      OR  0010
      =   xx1x

      Bit löschen:

      xxxx
      AND 1101
      =   xx0x

      Bit testen:

      xxxx
      AND 0010
      =   00x0  Wenn das Ergebnis 0 ist, war das Bit nicht gesetzt, ansonsten ist es größer als 0.

      Ergänzend wär dann noch Bit ändern.

      xx1x        xx0x
       XOR 0010    XOR 0010
       =   0000    =   0010

      Javascript-Operator ^=

      Grüße,
      Steffen.

      1. Hallo Steffen,

        Ergänzend wär dann noch Bit ändern.

        xx1x        xx0x
        XOR 0010    XOR 0010
        =   0000    =   0010

        Javascript-Operator ^=

        Das ist nicht korrekt.

        xx1x        xx0x
         XOR 0010    XOR 0010
         =   xx0x    =   xx1x

        Jonathan

        1. Hi,

          Ergänzend wär dann noch Bit ändern.

          xx1x        xx0x
          XOR 0010    XOR 0010
          =   0000    =   0010

          Javascript-Operator ^=

          Das ist nicht korrekt.

          xx1x        xx0x
          XOR 0010    XOR 0010
          =   xx0x    =   xx1x

          hm wenn mich nicht alles täuscht habt ihr beide unrecht, denn dieses beispiel kann man nicht mit algemeinen "x" darstellen, denn für eine bitweise xor verknüpfung müssen beide werte unterschiedlich sein also x xor 1 kann man nicht angeben und x xor 0 kann man auch nicht angeben solange man das x nicht kennt. Die xor verknüpfung ist eine entweder oder aber nicht gleich verknüpung (klingt irgendwie komisch).

          Beispiel:
          1 xor 0 = 1
          0 xor 1 = 1
          1 xor 1 = 0
          0 xor 0 = 0

          Grüße Flo

          1. Hallo Flo,

            hm wenn mich nicht alles täuscht habt ihr beide unrecht, denn dieses beispiel kann man nicht mit algemeinen "x" darstellen

            Doch kann man.

            Etwas XOR 0 ist immer der Ausgangswert. Etwas XOR 1 ist immer der invertierte Wert.

            xx1x        xx0x
             XOR 0010    XOR 0010
             =   xx0x    =   xx1x

            Beispiele:
                 1111
             XOR 0010
             =   1101

            0010
             XOR 0010
             =   0000

            1010
             XOR 0110
             =   1100

            x xor 1 kann man nicht angeben und x xor 0 kann man auch nicht angeben solange man das x nicht kennt.

            Doch.

            x XOR 0 = x
            x XOR 1 = NOT x (bzw. 1-x)

            (Natürlich nur sofern x nur ein Bit ist.)

            Jonathan

    2. Hallo,

      also brauche ich fürs Setzen und zum Prüfen immer einen zweiten Binären Wert zum Vergleich. Ich kann also nicht einen Wert nehmen und einfach ein it setzen. Verstehe ich das richtig?

      1. Hallo Matthias,

        also brauche ich fürs Setzen und zum Prüfen immer einen zweiten Binären Wert zum Vergleich.

        nö, nur eine Konstante, die das zu prüfende Bit widerspiegelt.
        Beispiel:

        ~~~javascript // Zufallszahl im Bereich 0..255 ermitteln
         var x = Math.floor(Math.random()*256);
         // Prüfen, ob Bit 5 gesetzt ist (2^5 = 32 = 0x20 = binär 00100000)
         if (x & 0x20)
          { alert("Bit 5 war gesetzt.");
          }

          
        
        > Ich kann also nicht einen Wert nehmen und einfach ein it setzen. Verstehe ich das richtig?  
          
        Weiß ich nicht - denn ich fürchte, ich verstehe \*dich\* nicht richtig. ;-)  
          
        So long,  
         Martin  
        
        -- 
        [Gültig](http://community.de.selfhtml.org/zitatesammlung/zitat134) sind Frauen ab 16, wohlgeformt ab 160 Pfund.  
          (Gunnar Bittersmann)
        
        1. echo $begrüßung;

          also brauche ich fürs Setzen und zum Prüfen immer einen zweiten Binären Wert zum Vergleich.
          nö, nur eine Konstante, die das zu prüfende Bit widerspiegelt.

          Oder zur Laufzeit einen Wert erzeugen:

          1 << (position_von_rechts - 1)

          schiebt ein Bit an eine bestimmte Position. Durch bitweise Negation lässt sich daraus auch ein Null-Bit zwischen Einsen erzeugen.

          echo "$verabschiedung $name";

          1. Hallo,

            nur eine Konstante, die das zu prüfende Bit widerspiegelt.
            Oder zur Laufzeit einen Wert erzeugen:
              1 << (position_von_rechts - 1)

            das Prinzip ist mir auch geläufig, nur die "-1" ist da irgendwie fehl am Platz. Damit würdest du ja für das Bit 0 einen Schiebe-Zähler von -1 erhalten!

            Ich weiß, immer dieses Plus/Minus-Eins-Problem ... ;-)

            So long,
             Martin

            --
            Most experts agree: Any feature of a program that you can't turn off if you want to, is a bug.
            Except with Microsoft, where it is just the other way round.
          2. Moin!

            Oder zur Laufzeit einen Wert erzeugen:

            1 << (position_von_rechts - 1)

            Sowas ist aber in PHP nicht schön, weil da kein Compiler den statischen Wert erkennt und generiert. Ich würd's jedenfalls nicht so programmieren. :)

            - Sven Rautenberg

            --
            "Love your nation - respect the others."