Java bitweiser Vergleich eines Bytes

8

Ich habe einen Wert DB von 3 Bytes (DB_1, DB_2, DB_3). Ich muss DB_3 nach bestimmten Bits überprüfen. Zum Beispiel muss ich sehen, ob  %Code% Wo nur die Bits 4, 6 und 7 überprüft werden sollen. Bits, die als DB_3 == 11X0XXXX markiert sind, können einen beliebigen Wert annehmen und sollten nicht überprüft werden. Ich bin mit Bit-Operationen in Java nicht vertraut und freue mich über jede Hilfe! Danke!

    
tzippy 14.12.2011, 12:15
quelle

4 Antworten

20

Sie können ein bitweises AND ( & in Java) verwenden, um die Maskierung auf bestimmte Bits durchzuführen (die Maske ist die zweite Zeile und lässt nur die Bits der ersten Zeile durch, in denen die Maske ein 1 [%] hat. markiert mit Pfeilen unter der Berechnung]):

%Vor%

Sie behalten genau die Bits bei, die 1 in beiden Operanden waren, also setzen Sie im Wesentlichen alle diese Bits auf 0 , an denen Sie nicht interessiert sind.

Sie müssen also nur

machen %Vor%

0xD0 ist die hexadezimale Form von 208 , die in binary 11010000 ist, und Sie möchten wissen, ob sie 0xC0 entspricht, also 192 oder 11000000 . Sie werden wissen, dass all die Bits, die Sie nicht interessieren (die X es in Ihrer Frage), zu diesem Zeitpunkt bereits Null sind, aufgrund der bitweisen AND.

ETA (2011-12-14 14:24): Anscheinend hat Java 7 binary Ganzzahlliterale , damit Sie

tun können %Vor%

was die Maske leichter sichtbar macht. Danke, Glenn .

    
Joey 14.12.2011, 12:21
quelle
7

Sie müssen Masken verwenden. Sie machen eine Bitoperation mit dem Wert und der Maske.
Das Ergebnis enthält nur das Bit, wenn es in den Wert gesetzt wurde.

Ссылка

    
hellectronic 14.12.2011 12:22
quelle
4

Während Joey's Methode gut funktioniert, gibt es hier eine andere Möglichkeit, die ich persönlich für intuitiver halte.

Sie benötigen zwei Masken: MASK1 = 11000000 , die definiert, wie DB_3 aussehen soll, und MASK2 = 11010000 , die definiert, welche Bits berücksichtigt werden sollen. 1 Bits in MASK2 zeigen Bits an, die uns wichtig sind und 0 Bits zeigen Bits an, die uns nicht interessieren.

Führe ein XOR mit MASK1 aus und invertiere das, dann ein AND mit MASK2 und überprüfe, ob das Ergebnis gleich MASK2 ist. Bei den ersten beiden Operationen wird 1 s gesetzt, wobei DB_3 und MASK1 übereinstimmen. Die dritte Operation löscht alle Ziffern im Ergebnis in 0 mit Ausnahme der Bits, die durch 1 s in MASK2 angezeigt werden. Der Vergleich wird nur dann als true ausgewertet, wenn DB_3 mit MASK1 an den Positionen übereinstimmt, die in 1 s in MASK2 angegeben sind.

%Vor%

Beispiel für die bitweisen Operationen:

%Vor%

Ich hoffe, das war verständlich.

    
Emil Lundberg 14.12.2011 12:34
quelle
1

Es ist ähnlich wie C. Überprüfen Sie: Ссылка

    
Ulf Jaehrig 14.12.2011 12:19
quelle

Tags und Links