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.
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.
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.
Dies sollte nur einen Unterschied machen, wenn es negative Bytes gibt. & 0xff
wird normalerweise verwendet, um ein Byte als vorzeichenlos zu interpretieren.
Tags und Links java bit-manipulation