undso: Bit setzen geht nicht

Hi Forum, hab ein kleines Problem.
mySQL 5.0.15

Ich kann Problemlos das 5'te Bit mit der Wertigkeit 16 löschen:

update Tabelle set spalte=spalte&11110

Leider klappt aber das setzen vom 5'ten Bit nicht mit:

update Tabelle set spalte=spalte|00001

Was mache ich da eigentlich falsch? Er addiert dann praktisch nur eine 1 drauf. Also setzt das erste Bit.

Grüße

  1. Moin Moin!

    Hi Forum, hab ein kleines Problem.
    mySQL 5.0.15

    Ich kann Problemlos das 5'te Bit mit der Wertigkeit 16 löschen:

    update Tabelle set spalte=spalte&11110

    Leider klappt aber das setzen vom 5'ten Bit nicht mit:

    update Tabelle set spalte=spalte|00001

    Was mache ich da eigentlich falsch? Er addiert dann praktisch nur eine 1 drauf. Also setzt das erste Bit.

    Mag sein, dass MySQL für Binärwerte das MSB rechts hat, glaube ich aber nicht. Meinst Du nicht eher 10000?

    Alexander

    --
    Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
    1. Hi Alexander,

      Moin Moin!

      Hi Forum, hab ein kleines Problem.
      mySQL 5.0.15

      Ich kann Problemlos das 5'te Bit mit der Wertigkeit 16 löschen:

      update Tabelle set spalte=spalte&11110

      Leider klappt aber das setzen vom 5'ten Bit nicht mit:

      update Tabelle set spalte=spalte|00001

      Mag sein, dass MySQL für Binärwerte das MSB rechts hat, glaube ich aber nicht. Meinst Du nicht eher 10000?

      Wenn das so wäre, würde
      das löschen des 5'ten Bits ja auch nicht klappen:
      update Tabelle set spalte=spalte&11110
      Hier zieht er korrekt 16 ab, bzw. löscht das 5'te Bit.

      Kann sein, dass aber dann bei | (ODER) es dann andersherum ist. Ich probiere das mal aus.

      Grüße

      1. Ohje,
        bei spalte=spalte|10000 wird 10000 drauf addiert.

        Komisch

        1. Hallo,

          Ohje,
          bei spalte=spalte|10000 wird 10000 drauf addiert.

          wie soll man auch erkennen, das du mit Binärzahlen arbeiten möchtest?

          http://dev.mysql.com/doc/refman/5.1/en/bit-functions.html

          Gruß plan_B

          --
               *®*´¯`·.¸¸.·
  2. Yerf!

    Ich kann Problemlos das 5'te Bit mit der Wertigkeit 16 löschen:

    update Tabelle set spalte=spalte&11110

    Zufall ;-)

    Leider klappt aber das setzen vom 5'ten Bit nicht mit:

    update Tabelle set spalte=spalte|00001

    Dies sollte das erste Bit setzen.

    Was mache ich da eigentlich falsch?

    Du benutzt Dezimalzahlen für Binäroperationen...

    Gruß,

    Harlequin

    --
    <!--[if IE]>This page is best viewed with a webbrowser. Get one today!<![endif]-->
    1. Servus,

      Ich kann Problemlos das 5'te Bit mit der Wertigkeit 16 löschen:

      update Tabelle set spalte=spalte&11110

      Zufall ;-)

      Shit :-)

      Was mache ich da eigentlich falsch?

      Du benutzt Dezimalzahlen für Binäroperationen...

      Das heißt? Sie Spalte in der DB ist "int". Sollte ich das auf Binary umstellen oder kann man in der Query dementsprechend mit rechnen?

      Irgendwie mit 1<<4 für das 5'te Bit ??

      Grüße

      1. Yerf!

        Das heißt? Sie Spalte in der DB ist "int". Sollte ich das auf Binary umstellen oder kann man in der Query dementsprechend mit rechnen?

        Nein, einfach nur, wenn du das 5.Bit mit der Wertigkeit 16 meinst auch 16 schreiben (und nicht elftauseneinhundertzehn, eine Zahl, bei der das 5. Bit übrigens 0 ist...)

        Irgendwie mit 1<<4 für das 5'te Bit ??

        Ich weis nicht, ob MySQL eine spezielle Schreibweise für Binärzahlen hat. Aber irgendwie muss man ja unterscheiden, ob das jetzt Binär oder Dezimal sein soll...

        Gruß,

        Harlequin

        --
        <!--[if IE]>This page is best viewed with a webbrowser. Get one today!<![endif]-->
        1. Hi,

          Nein, einfach nur, wenn du das 5.Bit mit der Wertigkeit 16 meinst auch 16 schreiben (und nicht elftauseneinhundertzehn, eine Zahl, bei der das 5. Bit übrigens 0 ist...)

          Ja, genau, so hatte ich das auch bisher. Hab entweder 16 auf die Spalte addiert oder subtrahiert.
          Das wollte ich nun abändern, indem ich anstatt Dezimal gezielt das 5'te Bit oder mehrere Bits Binär setze oder lösche.

          Hab herumgegoggelt aber leider nichts gefunden.

          Ich weis nicht, ob MySQL eine spezielle Schreibweise für Binärzahlen hat. Aber irgendwie muss man ja unterscheiden, ob das jetzt Binär oder Dezimal sein soll...

          Ja genau, das stimmt. Ich dachte, dass die Unterscheidung durch den Operator | bzw. & erfolgt.

          Irgendwo in einer Query hatte ich mal im Where-Teil eine Bedingung, der nur die Datensätze ausgibt, wo ein bestimmtes Bit gesetzt war. Finde leider die Qery nicht.

          Grüße

          1. Hi undso!

            Wie plan_b schon netterweise verlinkt https://forum.selfhtml.org/?t=167194&m=1090380 (und auch zu lesen war) hat, wird die angegebene Zahl nicht als Binär- sondern Dezimalzahl verstanden.
            Willst du also bit 5 (dezimalwert 16) setzen, so ver-oder-st du deinen Wert mit 16:
            update Tabelle set spalte = spalte | 16

            Wenn du dieses Bit löschen willst, dann (Variante1, bekannte bitbreite):

            Angenommen spalte hat 16 Bits, dann ist der "Maximalwert" 2^15-1=65535
            (=b1111 1111 1111 1111).
            Willst du nun das 5. Bit löschen: subtrahiere 16 von 65535, ergo:
            update Tabelle set spalte = spalte & 65519 (=b1111 1111 1110 1111)

            Es gibt es einen alten Programmierertrick (mal angenommen du weisst nicht wieviele Bits spalte hat):
            1. stelle sicher, dass Bit 5 gesetzt ist:
            update Tabelle set spalte = spalte | 16
            2. verwende nun xor mit dem fraglichen Bit:
            update Tabelle set spalte = spalte ^ 16

            Grüsse,
            Richard

            1. Ein kleiner Fehler:

              dann ist der "Maximalwert" 2^15-1=65535

              das muß natürlich heissen:
              dann ist der "Maximalwert" 2^16-1=65535

              Grüsse,
              Richard

            2. Hi,
              erstmal Dank an alle und auch an plan_b und ritschmanhard fürdie Tipps.

              Willst du also bit 5 (dezimalwert 16) setzen, so ver-oder-st du deinen Wert mit 16:
              update Tabelle set spalte = spalte | 16

              Ja genau, so geht es auch. Hier könnte ich aber nicht mehrere Bits auf einmal setzen. Oder, stop. Doch. Bsp. Bit 5 und 1:

              update Tabelle set spalte = spalte | 17

              Es gibt es einen alten Programmierertrick (mal angenommen du weisst nicht wieviele Bits spalte hat):

              1. stelle sicher, dass Bit 5 gesetzt ist:
                update Tabelle set spalte = spalte | 16
              2. verwende nun xor mit dem fraglichen Bit:
                update Tabelle set spalte = spalte ^ 16

              Genau. Das geht auch.
              Durch den Link von plan_b habe ich noch folgendes versucht:

              Das 5'te Bit setzen mit:

              update Tabelle set spalte=spalte|(b'10000');

              Und das 5'te Bit löschen mit:
              update Tabelle set spalte=spalte&(b'01111');

              Bei spalte=spalte|(b'10000'); bräuchte ich auch nicht beachten, wieviele Bits die Spalte hat, da ja nach Links alles mit 0 aufgefüllt wird.
              Bei spalte=spalte&(b'01111'); wird eher problematisch, aber meinem Vorhaben eher egal, da ich genau weiß, wieviele Bits die Spalte hat.

              Grüße

              1. Hi undso!

                Bei spalte=spalte&(b'01111'); wird eher problematisch, aber meinem Vorhaben eher egal, da ich genau weiß, wieviele Bits die Spalte hat.

                Dir ist klar, dass diese Anweisung alle bits ausser 1,2,3,4 löscht?
                Also 5 (wie beabsichtigt),6,7,... (wieviele auch immer drüber kommen)?

                Dann ist es OK...
                Merke: nur mit 1 ver-und-ete Bits stehen nach der ver-und-ung noch auf ihrem ursprünglichen Wert.

                Grüsse,
                Richard

                1. Hi Richard,

                  Bei spalte=spalte&(b'01111'); wird eher problematisch, aber meinem Vorhaben eher egal, da ich genau weiß, wieviele Bits die Spalte hat.

                  Dir ist klar, dass diese Anweisung alle bits ausser 1,2,3,4 löscht?
                  Also 5 (wie beabsichtigt),6,7,... (wieviele auch immer drüber kommen)?

                  Das ist mir klar. Weil, ja nach links alles mit einer 0 gefüllt wird und somit alle Bits gelöscht werden.

                  Dann ist es OK...
                  Merke: nur mit 1 ver-und-ete Bits stehen nach der ver-und-ung noch auf ihrem ursprünglichen Wert.

                  Jepp. Zur Not mache ich es so, wie du es beschrieben hast, falls ich doch mal die Länge nicht kenne:

                  1. stelle sicher, dass Bit 5 gesetzt ist:
                    update Tabelle set spalte = spalte | 16
                  2. verwende nun xor mit dem fraglichen Bit:
                    update Tabelle set spalte = spalte ^ 16

                  Das kann man ja auch mit einer Query machen ne:

                  update Tabelle set spalte = spalte | 16, spalte = spalte ^ 16;

                  Oder

                  update Tabelle set spalte = (spalte | 16)  ^ 16;

                  Was ich mich auch spontan gefragt habe, ob ich eine Spalte selektieren kann, in der ein bestimmtes gesetzt ist.

                  select blabla from Tabelle where spalte=(spalte&16)=16
                  Ja gut, damit will ich euch nicht nerven und diesen Threas missbrauchen, ich suche mal in der mySQL Doku.

                  Grüße

      2. Hallo,

        Irgendwie mit 1<<4 für das 5'te Bit ??

        http://dev.mysql.com/doc/refman/5.1/en/bit-field-values.html

        Gruß plan_B

        --
             *®*´¯`·.¸¸.·
  3. echo $begrüßung;

    Hi Forum, hab ein kleines Problem.

    Hi undso, hab ein kleines Déjà-Vu.

    echo "$verabschiedung $name";

    1. Hi dedle,

      stimmt. Bei dem Thread ging es mehr um die Rechnung:

      Bsp:
         101001
         100111 &
      -----------
         100001

      In dem Thread habe ich leider aber nicht konkret die Query behandelt, sondenr nur an sich den Rechnungschritt, deshalb stand ich heute vor dem Problem, dass die Querys nicht funktionierten ;))

      Grüße