Bitweise Operatoren kommen ins Spiel, wenn Sie mit Byte- oder Bit-Level-Daten arbeiten müssen.
Hier Liste ich eine Handvoll Beispiele Bit-Operationen mit Codebeispielen verwendet (in keiner bestimmten Reihenfolge):
1. Sie sind häufig und Bestandteil vieler Algorithmen in Kryptographie und Hash Funktionen (zB MD5).
2. Sie werden häufig auch verwendet, wenn Sie Raum zu „retten“ wollen, und Sie Pack mehr „Bool“ Variablen in eine int
Sie zum Beispiel einen Bit jeden Bool Variablen zuweisen. Sie müssen bitweise Operatoren verwenden, um die Bits einzeln ändern/lesen zu können.
Zum Beispiel Verpackung 8 Bit/bools in einem int
:
flags := 0x00 // All flags are 0
flags |= 0x02 // Turn the 2nd bit to 1 (leaving rest unchanged)
flags |= 0xff // Turn 8 bits (0..7) to 1
flags &= 0xfe // Set the lowest bit to 0 (leaving rest unchanged)
istrue := flags&0x04 != 0 // Test if 3rd bit is 1
3. Ein weiterer Bereich ist Datenkomprimierungs, wo Sie das Beste aus einem byte
erhalten möchten und alle seine Bits verwenden, um speichern/retreive einige Informationen (ein Bit ist die grundlegende Informationseinheit in der Computer- und digitalen Kommunikation).
4. Ähnlich wie die Komprimierung aber nicht ganz das Gleiche: bitstreams. Es wird auch verwendet, um Platz in einem Datenstrom zu sparen, indem keine vollständigen Bytes, sondern Felder mit beliebiger Bitlänge gesendet werden.
Ich habe ein hoch optimiertes Bit-Level-Reader- und Writer-Paket geschrieben und veröffentlicht, das hier veröffentlicht wurde: github.com/icza/bitio. In seinen Quellen wird eine umfangreiche Verwendung aller Arten von Bitoperationen angezeigt.
5. Eine weitere praktische Verwendung: Testen bestimmter Eigenschaften einer (ganzen) Zahl. Wenn man die binäre Darstellung von ganzen Zahlen kennt (Two's complement), gibt es bestimmte Eigenschaften von Zahlen in ihrer binären Darstellung. Zum Beispiel eine ganze Zahl (in 2-Komplement) ist sogar (kann durch 2 geteilt werden), wenn das niedrigste Bit 0:
func isEven(i int) bool {
return i&0x01 == 0
}
durch die Bits eines ganzzahligen Testen kann man auch sagen, ob es eine Leistung ist Wenn eine positive Zahl nur ein Bit 1
enthält, dann ist es eine Potenz von 2 (z2 = 0x02 = 00000010b
, 16 = 0x10 = 00010000
aber zum Beispiel 17 = 0x11 = 00010001
nicht power von 2).
6.Viele Codierungs-/Decodierverfahren verwenden auch Bitoperationen. Am trivialsten ist die UTF-8 encoding, die eine Codierung mit variabler Länge zum Darstellen von Unicode-Codepunkten (rune
in Go) als Bytefolgen verwendet.
Eine einfache Variante einer Codierung mit variabler Länge könnte sein, das höchste Bit eines Bytes (8. oder 7. wenn 0-indexiert) zu verwenden, um zu signalisieren, ob mehr Bytes benötigt werden, um eine Zahl zu decodieren, und die restlichen 7 Bits sind immer die "nützliche" Daten. Sie können die höchste Bit testen und zu „trennen“ die 7 Nutzbits wie folgt aus:
b := readOneByte()
usefulBits := b & 0x7f
hasMoreBytes := b & 0x80 != 0
Der Gewinn der Verwendung eines solchen Codierung mit variabler Länge ist, dass selbst wenn Sie uint64
Typ in Go verwenden, die 8 Bytes im Speicher kleine Zahlen können immer noch mit weniger Bytes dargestellt werden (Zahlen im Bereich 0..127
benötigen nur 1 Byte!). Wenn die Samples, die Sie speichern oder übertragen möchten, viele kleine Werte haben, kann dies allein die Daten auf 1/8 = 12,5% komprimieren. Der Nachteil ist, dass große Zahlen (die Bits sogar im höchsten Byte haben) mehr als 8 Bytes verwenden werden. Ob es sich lohnt, hängt von der Heuristik der Samples ab.
X.Und die Liste geht weiter ...
Können Sie leben ohne zu wissen,/mit bitweise Operatoren in Go (und in vielen anderen Programmiersprachen)? Die Antwort ist ja. Aber wenn Sie sie kennen, können sie manchmal Ihr Leben einfacher und Ihre Programme effizienter machen.
Wenn Sie mehr über das Thema erfahren möchten, lesen Sie den Wikipedia-Artikel: Bitwise operation und google den Begriff "Bitwise Operators Tutorial", es gibt viele gute Artikel.
Schnappen Sie sich ein Buch wie Petzolds "Code", um ein grundlegendes Verständnis der binären Darstellung und der Grundlagen des Computing zu erhalten. –