2017-11-17 2 views
1
byte right =0xf; // 00001111 
    System.out.println(Integer.toBinaryString(right)); // 00001111 

    right = (byte)(right << 4); 
    System.out.println(Integer.toBinaryString(right)); // 11111111111111111111111111110000 

Warum right entspricht 11111111111111111111111111110000? Ich werfe es explizit auf Byte = 8 Bits.Bits nach links verschieben

Ich erwarte eine Ausgabe: 11110000.

+2

Yup, du wirfst es explizit in Byte und wirfst es dann implizit in int zurück. Es ist der letzte Schritt, der es mit Einsen gefüllt hat. –

Antwort

10

Wenn Sie hatten nicht umgewandelt zu byte, wäre alles gut.

Es sind keine Schichtoperatoren für byte definiert, daher wird der Wert zuerst auf int hochgestuft - was gut ist und immer noch 0000 [...] 1111.

Sie verschieben dann nach links 4 Bits und geben 0000 [...] 111000.

Sie werfen dann byte auf, ein Byte 11110000

geben Sie rufen dann Integer.toBinaryString, die einen int Parameter annimmt. Das bedeutet, dass das Byte 1111000 in int konvertiert wird - an diesem Punkt wird es vorzeichenerweitert auf 1111111111111111111111111111110000 (gemäß JLS 5.1.2), das dann gedruckt wird.

Optionen:

  • Verwirf nach unten nicht zu byte, so dass man mit einem Umsatz am Ende nicht wieder zu int. (Z int shifted = right << 4; verwenden und dann shifted in Integer.toBinaryString passieren.)
  • Anstatt die Umwandlung implizit verlassen, verwenden right & 0xff eine Bitmaske anzuwenden, so können Sie nur die unteren 8 Bit gesetzt.

Entweder druckt 11110000 stattdessen.

Verwandte Themen