„Hallo, Amigo!“

„Ich würde auch gerne über Bitmasken und XOR sprechen.“

„Sie wissen bereits, dass Zahlen aus Bits bestehen, und Sie können verschiedene Operationen an diesen Bits durchführen. Eine Bitmaske ist eine Darstellung mehrerer verschiedener logischer Werte (wahre/falsche Werte) als eine einzelne Ganzzahl. In diesem Fall entspricht jeder boolesche Wert ein bestimmtes Bit. So könnte das gemacht werden:"

„Die binäre Darstellung von Zweierpotenzen (1, 2, 4, 8, 16, 32, ...) erfordert nur das Setzen eines Bits:“

Nummer Binäre Darstellung
1 0000 0001
2 0000 0010
4 0000 0100
8 0000 1000
16 0001 0000
19 (keine Zweierpotenz) 0001 0011
31 (keine Zweierpotenz) 0001 1111

„Daher kann jede Ganzzahl als Array von Bits oder als Array von booleschen Werten behandelt werden.“

„So können Sie verschiedene boolesche Werte in einer Zahl speichern:“

Boolesche Werte
boolean a = true;
boolean b = false;
boolean c = true;
boolean d = false;
In eine Zahl gepackte Werte:
int result = 0;
 if (a) result += 1; // 1 == 20 — bit 0
 if (b) result += 2; // 2 == 21 — bit 1
 if (c) result += 4; // 4 == 22 — bit 2
 if (d) result += 8; // 8 == 23 — bit 3

„Jetzt ist jedes Bit 1, wenn die entsprechende boolesche Variable wahr war.“

In unserem Fall waren die Variablen a und c wahr, das Ergebnis ist also gleich 1+4 == 5

0000 0101
0000 dcba

„Ich glaube, ich weiß, was passiert.“

„Nun, wenn du es verstehst, lass uns weitermachen.“

„Ein int hat 32 Bits. Eines davon wird für das Vorzeichen der Zahl verwendet und die anderen 31 können zum Speichern der Werte von 31 booleschen Variablen verwendet werden.“

„Ein Long hat 64 Bits, in denen wir 63 boolesche Variablen speichern können.“

"Ja."

„Dutzende Variablen in einer Zahl zusammengepfercht. Das sind ziemlich viele.“

„Aber wo wird das angewendet?“

„Hauptsächlich in Situationen, in denen Sie viele Informationen über Objekte speichern müssen. Wenn Sie viele Informationen über ein Objekt speichern, gibt es immer ein paar Dutzend boolesche Variablen.“ Bei diesem Ansatz werden sie alle bequem in einer Zahl gespeichert ."

„Mit Betonung auf dem Wort ‚gespeichert‘. Weil die tatsächliche Verwendung der Nummer nicht so bequem ist.“

„Das ist übrigens genau das, was ich fragen wollte. Wie extrahieren wir den booleschen Wert aus der Zahl?“

„Es ist überhaupt nicht kompliziert. Nehmen wir an, Sie müssen feststellen, ob Bit 6 auf 1 gesetzt ist (2 hoch fünf ist 32). Wir könnten das so überprüfen:“

Kombinieren Sie Zahlen zu einer:
int a = 32; // 25 == 0010 0000
int b = 8; // 23 == 0000 1000
int c = 2; // 21 == 0000 0010

int result = a + b + c; // 32 + 8 + 2 == 42 == 0010 1010
Extrahieren Sie Werte, indem Sie bestimmte Bits überprüfen:
int a = result & 32; // 0010 1010 & 0010 0000 = 0010 0000
int b = result & 8; // 0010 1010 & 0000 1000 = 0000 1000
int c = result & 2; // 0010 1010 & 0000 0010 = 0000 0010

„Die Arbeit mit Bitmasken umfasst also drei Vorgänge:“

1)  Setzen Sie ein bestimmtes Bit auf 0

2)  Setzen Sie ein bestimmtes Bit auf 1

3)  Überprüfen Sie den Wert des spezifischen Bits.

„Nehmen Sie zum Beispiel Bit 6.“

„Wie setzt man Bit 6 auf 1?“

Code Beschreibung
result = result | 01000000;
result |= 01000000;
Wie setzt man Bit 6 auf 1?
result = result & 10111111;
result &= 10111111;
Wie setzt man Bit 6 auf 0?
c = result & 01000000;
Wie erhält man den Wert von Bit 6?

„Das ist höchst ungewöhnlich, aber nicht schwierig. Mann, jetzt bin ich ein Top-Programmierer.“

„Und noch ein kleiner Tipp, wie man ganz einfach Zahlen erhält, bei denen ein bestimmtes Bit auf 0 oder 1 gesetzt ist: 01000000 oder 10111111.“

Dafür gibt es die  Operatoren >> und  << .

„1 ist 2 hoch null. Mit anderen Worten, eine Zahl, bei der Bit 0 auf 1 gesetzt ist. Wir brauchen eine Zahl, bei der Bit 6 gesetzt ist.“

int c = 1 << 6; // 0000 0001 << 6 == 0100 0000 == 64

„Cool! Das ist in solchen Fällen wirklich hilfreich.“

„Aber was ist, wenn ich eine Zahl benötige, bei der jedes Bit auf 1 gesetzt ist, außer dass ein bestimmtes Bit auf 0 gesetzt ist?“

„Das ist auch nicht schwer:“

int d = ~(1 << 6); // ~0100 0000 == 10111111

„Mit anderen Worten, es ist alles ganz einfach:“

Code Beschreibung
result = result | (1 << 6);
result |= (1 << 6);
Wie setzt man Bit 6 auf 1?
result = result & ~(1 << 6);
result &= ~(1 << 6);
Wie setzt man Bit 6 auf 0?
c = result & (1 << 6);
Wie erhält man den Wert von Bit 6?

„Es sieht nicht sehr schwierig aus. Aber ich werde mich nicht sofort daran erinnern.“

„Aber wenn Sie im Code einer anderen Person auf einen beängstigenden Ausdruck wie „Ergebnis &= ~(1 << 6)“ stoßen, wissen Sie, dass diese Person nur mit einer Bitmaske arbeitet.“

„Und wenn du ihm oft begegnest, dann wird er sich für dich an sich selbst erinnern.“

„Erinnere dich an dich selbst... Das hört sich gut an. Danke für die Lektion.“