Wir wissen, dass alle Zahlen im Programm in binärer Form im Computerspeicher gespeichert sind und Bitoperationen direkt auf den Binärbits von Ganzzahlen im Speicher ausgeführt werden sollen. Beispielsweise ist die UND-Operation ursprünglich ein logischer Operator, die UND-Operation kann jedoch auch zwischen ganzen Zahlen durchgeführt werden.
Bitoperationen umfassen hauptsächlich Schiebeoperationen und logische Operationen. Als nächstes werden wir über Schichtoperationen bzw. logische Operationen sprechen.
Verschiebungsoperation:
Linksverschiebung: Der Operator ist <<, nach links bewegen, 0 zum niedrigen Bit rechts hinzufügen, das hohe Bit links verwerfen, binär als Ganzzahl behandeln und 1 Bit verschieben nach links entspricht einer Multiplikation mit 2. Rechtsverschiebung ohne Vorzeichen: Der Operator ist >>>, bewegt sich nach rechts, verwirft die rechte Seite und fügt 0 zur linken Seite hinzu. Vorzeichenbehaftete Rechtsverschiebung: Der Operator ist >>, nach rechts verschieben und die rechte Seite verwerfen. Der auf der linken Seite hinzugefügte Wert hängt vom ursprünglichen höchsten Bit ab. Wenn es ursprünglich 1 ist, addieren Sie 1, und wenn es 0 ist , füge 0 hinzu. Stellen Sie sich die Binärzahl wie folgt vor: Bei einer Ganzzahl entspricht das Verschieben um 1 Bit nach rechts einer Division durch 2.
Zum Beispiel:
int a = 4; // 100 a = a >> 2; // 001,等于1 a = a << 3 // 1000,变为8
Logische Operationen umfassen:
Bitweises UND &: Nur wenn beide Bits 1 sind, ist 1
Bitweises ODER|: Solange ein Bit 1 ist, ist es 1
Bitweise Negation~: 1 wird 0, 0 wird 1
Bitweises XOR^: Unterschiedlich ist wahr, Gleiches ist falsch
Zum Beispiel:
int a = ...; a = a & 0x1 // 返回0或1,就是a最右边一位的值。 a = a | 0x1 //不管a原来最右边一位是什么,都将设为1
Schauen wir uns ein paar einfache Anwendungsszenarien an:
Szenario 1 : Bestimmen Sie ungerade und gerade
Analyse: Ungerade Zahlen sind keine ganzzahligen Vielfachen von 2. Nach der Konvertierung in Binärzahlen muss das niedrigste Bit 1 sein, bei geraden Zahlen ist das Gegenteil der Fall. Mit dieser Funktion können wir die Parität einer Ganzzahl einfach durch Bitoperationen bestimmen.
Schauen Sie sich den Code an:
int i = 1;// 二进制存储方式为00000000000000000000000000000001 int j = 5;// 二进制存储方式为00000000000000000000000000000101 int k = 6;// 二进制存储方式为00000000000000000000000000000110 if ((i & j) == 1) { System.out.println("j的最低位为1,为奇数"); } if ((i & k) == 0) { System.out.println("k的最低位为0,为偶数"); }
Szenario 2: Bestimmen Sie, ob eine positive ganze Zahl eine ganzzahlige Potenz von 2 ist
Analyse: Schauen wir uns zunächst die üblichen ganzzahligen Potenzen von 2 an: 2, 4, 8, 16, Konvertierung Die Binärzahl Zahlen sind: 10, 100, 1000, 10000. Haben Sie das Muster gefunden? Das heißt, bis auf das erste Bit, das 1 ist, sind alle anderen Bits 0. Es ist einfach so, dass nach der Subtraktion von 1 von diesen Zahlen die Ergebnisse ihrer bitweisen Inversionen übereinstimmen. Beispielsweise kann 8-1=7, was binär 111 ist, durch bitweise Invertierung der binären 1000 von 8 erhalten werden. Und 8&7=0, extrahieren Sie die Regel und sie lautet:
(n&(n-1))==0
Das n, das dieser Regel entspricht, ist eine ganzzahlige Potenz von 2.
(Teilen von Lernvideos: Java-Video-Tutorial)
Szenario 3: Einfache Sammlungsverarbeitung
Kein Unsinn, schauen Sie sich einfach den Code an:
public class SimpleSet { public static final int A = 0x01;// 最后四位为0001 public static final int B = 0x02;// 最后四位为0010 public static final int C = 0x04;// 最后四位为0100 public static final int D = 0x08;// 最后四位为1000 private int set = 0x00;// 初始0000,空集合 public void add(int i) {// 将i对应位的值置为1,重复add不影响。默认传入值为ABCD之一,此处省去边界判断 set |= i; } public boolean contain(int i) {// 判断相应位置是否为1 return (set & i) == i; } public boolean remove(int i) {// 来不及不解释了快看代码 if (contain(i)) { set -= i; return true; } else { return false; } } }
Testen Sie ihn:
public static void main(String[] args) { SimpleSet set = new SimpleSet(); System.out.println(set.contain(A)); set.add(B); System.out.println(set.contain(A)); System.out.println(set.contain(B)); set.add(A); set.add(C); System.out.println(set.contain(A)); set.remove(A); System.out.println(set.contain(A)); System.out.println(set.remove(A)); System.out.println(set.contain(C)); }
Die Ausgabe lautet:
false false true true false false true
Okay, keine Frage.
Sie denken vielleicht, dass A, B, C und D im obigen Beispielcode den Aufzählungen etwas ähneln. Tatsächlich verwendet die Sammlungsklasse EnumSet im JDK-Quellcode für Aufzählungen eine ähnliche Lösung, die natürlich komplizierter ist Wenn Sie interessiert sind, können Sie sich den Quellcode ansehen, der Bitvektor heißt.
Übrigens gibt es in Integer, der Verpackungsklasse von int in Java, viele statische Tools, die Bitoperationen bereitstellen, und die meisten davon sind sehr komplex. Wenn Sie interessiert sind, können Sie es sich ansehen
Fazit:
Bit-Operationen sind die Operationen, in denen Computer am besten sind. Sie werden auch häufig im Quellcode von JDK verwendet. Wenn wir sie verstehen, können wir den Computer besser verstehen und eleganteren Code schreiben.
Verwandte Empfehlungen: Java-Einführungs-Tutorial
Das obige ist der detaillierte Inhalt vonEinführung in Bitoperationen und Anwendungsszenarien in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!