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.
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. –