ich einige seltsame unsigned rechts Schichtbetrieb produzieren falsche Ergebnisse erlebe, wenn man versucht, sie auf hartcodierte auszuführen und nicht hartcodierte Daten auf Java 8.Unsigned rechte Umschalttaste auf Signed Bytes produziert Fehler
Ich versuche, Führen Sie eine vorzeichenlose Rechtsverschiebung für ein vorzeichenbehaftetes Byte 0xBF
durch. Wenn ich einfach das vorzeichenbehaftete Byte einer Variablen zugewiesen habe und dann die Variable für eine vorzeichenlose Rechtsverschiebung verwende, bekomme ich 0xDF
. Wenn ich die 0xBF in die vorzeichenlose Rechtsverschiebung fest einprogrammiere, bekomme ich 0x5F
.
byte originalByte = (byte) 0xBF;
System.out.println("Original Data: " + toHexString(new byte[]{originalByte}));
byte rotatedByte = (byte) (originalByte >>> 1);
System.out.println("Rotated Data: " + toHexString(new byte[]{rotatedByte}));
byte signRemoved = (byte) (0xBF >>> 1);
System.out.println("Sign Removed Data: " + toHexString(new byte[]{signRemoved}));
Die Ausgabe von dem obigen Java-Aufruf.
Original Data: BF
Rotated Data: DF
Sign Removed Data: 5F
Wie soll ich das obige Problem lösen?
"unsigned rechts Verschiebung" in Java ist ein bisschen eine falsche Bezeichnung. Der verschobene Wert ist immer noch signiert, aber das Vorzeichenbit wird verschoben und durch Null ersetzt. Es macht also einen Unterschied, wenn Sie ein "Byte" gegen ein "Int" verschieben, da das Vorzeichenbit an einer anderen Stelle ist. – davmac