Anding mit 0xff, Klärung benötigt

7

Ziehen Sie im folgenden Abschnitt in Betracht, Zeile 8 durch kommentiertes Äquivalent zu ersetzen

%Vor%

.equals() test bestätigt, dass das Hinzufügen von 0xff nichts ändert. Gibt es einen Grund für die Anwendung dieser Maske?

    
JAM 30.03.2012, 20:15
quelle

4 Antworten

16

byte in Java ist eine Zahl zwischen -128 und 127 (ohne Vorzeichen, wie jede Ganzzahl in Java (mit Ausnahme von char , wenn Sie sie zählen möchten). Wenn Sie mit 0xff arbeiten, erzwingen Sie eine positive int zwischen 0 und 255.

Es funktioniert, weil Java eine erweiterte Konvertierung in int durchführt, indem es die Zeichenerweiterung verwendet. Daher wird statt eines negativen byte ein negatives int angezeigt. Maskierung mit 0xff lässt nur die unteren 8 Bits übrig, wodurch die Zahl wieder positiv wird (und was Sie ursprünglich beabsichtigt hatten).

Sie haben wahrscheinlich den Unterschied nicht bemerkt, weil Sie mit byte[] nur mit Werten kleiner als 128 getestet haben.

Kleines Beispiel:

%Vor%

Dies druckt

%Vor%

zeigt den Unterschied zwischen dem, was in byte ist, was in das Byte hineingelaufen ist, als es noch int war und was das Ergebnis der Operation & ist.

    
Joey 30.03.2012, 20:20
quelle
3

Da Sie hier bereits mit einem Array von Bytes arbeiten und eine bitweise Operation ausführen, können Sie ignorieren, wie Java alle Bytes als signiert behandelt. Schließlich arbeiten Sie jetzt auf der Bit-Ebene und es gibt keine "signierten" oder "unsignierten" Werte auf der Ebene der Bits.

Das Maskieren eines 8-Bit-Wertes (eines Bytes) mit allen 1 ist nur eine Verschwendung von Zyklen, da nichts jemals maskiert wird. Ein Bite-seitiges UND gibt ein bisschen wahr zurück, wenn beide Bits verglichen werden, also wenn die Maske alle Einsen enthält, dann ist garantiert, dass alle Bits des maskierten Wertes nach der UND-Operation unverändert bleiben.

Betrachten Sie die folgenden Beispiele:

%Vor% %Vor% %Vor%

Natürlich würden Sie, wenn Sie mit einem vollständigen int hier arbeiten würden, das Ergebnis bei den anderen bekommen, die gesagt haben: Sie würden "den Int zwingen", das Äquivalent eines vorzeichenlosen Bytes zu sein.

    
Wkter 30.03.2012 21:00
quelle
1

In diesem Beispiel sehe ich nicht, wie es einen Unterschied machen würde. Sie reiben die 0xff mit einem Byte. Ein Byte hat definitionsgemäß 8 Bits, und das Hinzufügen maskiert die letzten 8 Bits ab. Also nimmst du die letzten 8 von 8, das wird nichts machen.

Anding mit 0xff würde Sinn ergeben, wenn die Sache, die du damit verfolgst, größer ist als ein Byte, ein Short oder ein Int oder was auch immer.

    
Jay 30.03.2012 20:18
quelle
1

Dies sollte nur einen Unterschied machen, wenn es negative Bytes gibt. & 0xff wird normalerweise verwendet, um ein Byte als vorzeichenlos zu interpretieren.

    
Louis Wasserman 30.03.2012 20:21
quelle

Tags und Links