2016-05-18 7 views
-1

enter image description hereUnsigned Schichtbetrieb in Java

Könnte jemand sagt mir, wie kann diese Operationen Ergebnisse "sar" eine negative Zahl?

+2

Denn das ist das Ergebnis von 'Daten [0] >>> 6'. – Maroun

+1

Mögliches Duplikat von [Java: Negative Zahl verschieben] (http://stackoverflow.com/questions/29498247/java-shift-negative-number) & [Bitweises Shift-Operator mit Verschiebung um negative Zahl] (http: // stackoverflow .com/q/15603327/876298) & [Bitweises Linksverschiebungsverhalten] (http://Stackoverflow.com/q/19839184/876298) –

Antwort

4

data[0] wird zu int befördert, bevor der Schichtoperator angewendet wird.

Wenn also beispielsweise data[0] ist -128,

Sie auf der int -128 die Verschiebung anwenden, deren binäre Darstellung ist:

11111111 11111111 11111111 10000000 

Dies führt zu

00000011 11111111 11111111 11111110 

Und nachdem Sie das auf byte zurückgeworfen haben, erhalten Sie eine negative Nummer

      11111110 (-2) 

Wenn Sie die 1-Bits ignoriert werden sollen, die als Ergebnis der int Förderung hinzugefügt wurden, können Sie schreiben:

byte sar = (byte) ((data[0]&0xff)>>>6); 

Das in 2 führen wird (wenn data[0] ist -128).

+0

Danke, die einzige Möglichkeit, wie ich dieses Schichtverhalten wie normal ohne Vorzeichen machen kann Verschiebung im Bytebereich, das ist [Byte sar = (Byte) (Daten [0] >>> 6 && 0x3).] –