2016-08-13 1 views
0

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?

+0

"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

Antwort

0

Im Falle eines gedrehten Bytes führen Sie die Operation beim Bytetyp durch. Im Fall von signRemoved führen Sie die Operation für den Int-Typ aus und nach der Operation wird sie in Byte umgewandelt. Daher ist das Ergebnis anders.

int i = 0xBF; // this is int and the value is 191 
byte b = (byte) 0xBF; // this is byte and value is -65 

int i2 = (i >>> 1) //here the operation is done on int result is 95 
byte b2 = (byte) i2 // result stays 95 

int i3 = b >>> 1 // here b is first promoted to int (-65) then after right shift it becomes 2147483615 
byte b3 = (byte) i3 // -33 
+0

Wie bekomme ich 0xBF vom Byte-Typ zu 0x5F als Byte-Typ, ohne Ganzzahl verwenden zu müssen? – thotheolh

+0

Bei der Verwendung von Shift-Operatoren werden Bytes immer zuerst in Ints konvertiert, da Verschiebeoperatoren auf Ints in Java arbeiten. Dies erklärt es gut http://stackoverflow.com/questions/3948220/behaviour-of-unsigned-right-shift-applied-to-byte-variable –

Verwandte Themen