2016-05-06 4 views
3

Ich habe diese Tabelle:Wie kann ein einzelnes Bit einer Binärzahl als Toggle aktualisiert werden?

// numbers 
+---------+------------+ 
| id | numb | 
+---------+------------+ 
| int(11) | bit(10) | 
+---------+------------+ 
| 1  | 1001100111 | 
| 2  | 0111000101 | 
| 3  | 0001101010 | 
| 4  | 1111111011 | 
+---------+------------+ 

Ich versuche (Toggle) den Wert der siebten Stelle (rechts nach links) zu ändern. So konzentrieren sich auf diese Ziffer:

// for example 
1001100111 
^seventh digit (rtl) 

Und das erwartete Ergebnis:

// new_numbers 
+---------+------------+ 
| id | numb | 
+---------+------------+ 
| int(11) | bit(10) | 
+---------+------------+ 
| 1  | 1011100111 | 
| 2  | 0101000101 | 
| 3  | 0011101010 | 
| 4  | 1101111011 | 
+---------+------------+ 

Ich kann wie siebte Stelle aktualisieren

// set it to zero 
UPDATE numbers SET numb = numb & b'1110111111'; 

Aber eigentlich muss ich es wechseln.

  • wenn es 0 dann setzen sie 1
  • wenn es 1 dann setzen sie 0

Wie kann ich das tun?

Antwort

3

Das Spiegeln eines Bits erfolgt durch XOR ^ Operation mit einer Maske, die 1 s in Positionen hat, die Sie umschalten möchten. Diese

funktioniert, weil die Wahrheitstabelle von XOR wie folgt aussieht:

A: 0 0 1 1 
    B: 0 1 0 1 
A^B: 0 1 1 0 

Beachten Sie die Spalten, in denen B ist 1: wenn das entsprechende Bit in A Null ist, ist das Ergebnis ein, und umgekehrt.

Togging siebte Bit wird folgendermaßen gemacht:

UPDATE numbers SET numb = numb^b'0001000000'; 
+0

OMG sehen wollen ... Brillant ..! danke .. upvote – stack

+0

Ich bin wunder .. Was ist Ihre Expertise? Sie haben eine goldene Plakette in C++, C#, IOS und .. ** außer ** MySQL. Aber Sie beantworten die Fragen von MySQL als Experte. Schön für dich. – stack

+0

@stack Ehrlich gesagt, ich kannte keine MySQL-unterstützten Bit-Operatoren, bis ich heute Morgen Ihre andere Frage sah. Ich schaute das Handbuch nach und sah, dass MySQL die gleichen Operatoren wie C, C++, C#, Java und viele andere Sprachen verwendet. Arbeiten mit Bits ist eine portable Fähigkeit, weil die Operationen immer gleich sind. Alles, was Sie tun müssen, ist die Syntax in Ihrer Sprache nachzuschlagen. – dasblinkenlight

1

Sie können es einfach, mit XOR tun ^. Sie können den Operanden in jedem System wie 1,2,4,8 ... für das Bit 0,1,2,3 ODER b'1 ', b'10', b'100 'angeben. Jedes Bit ist gesetzt wurde invertiert.

In Ihrem Beispiel ist der Operand 128 oder b'100000000'

SAMPLE

SELECT b'1110111110'^1 , b'1110111111'^1 ; 
SELECT b'1110111110'^128 , b'1100111111'^128 ; 

Wenn Sie es als BITs

SELECT BIN(b'1110111110'^1 ), BIN(b'1110111111'^1 ); 
SELECT BIN(b'1110111110'^128), BIN(b'1100111111'^128); 
Verwandte Themen