Warum, wenn ich versuche, Bits für 11010100 2 zu verschieben , ist das Ergebnis 110101000 2 , nicht 10101000 2 .
int a = Integer.parseInt("11010100", 2) << 1;
Ich versuche das zu tun:
int a = (byte)(Integer.parseInt("11010100", 2) << 1);
Wenn der Ausgabewert jedoch größer als 128 ist, geht alles in ein Minus, was logisch ist. Wie kann ich dafür sorgen, dass sich die Anzahl der Bits nicht ändert?
int
s oderlong
s ausgeführt.Antworten:
Lassen Sie es uns Schritt für Schritt machen.
Integer.parseInt("11010100", 2)
- das ist der int-Wert 212. Das ist übrigens unnötig; Sie können einfach schreiben :0b11010100
.0b11010100 << 1
ist das gleiche wie0b110101000
und ist 424.Sie wandeln es dann in ein Byte um :
(byte)(0b11010100 << 1)
. Die Bits jenseits der ersten 8 werden alle abgeschnitten, wodurch 0b10101000 übrig bleibt, was -88 ist. Minus, ja, weil in Java Bytes signiert sind.Sie setzen diese -88 dann stillschweigend wieder auf int zurück, während Sie sie einem int-Wert zuweisen. Es bleibt -88, was bedeutet, dass alle oberen Bits alle 1s sind.
Daher ist der Endwert
-88
.Wenn Sie
168
stattdessen sehen möchten (was genau die gleichen Bits sind, aber ohne Vorzeichen statt mit Vorzeichen angezeigt werden), verwenden Sie den üblichen Trick& 0xFF
, bei dem alle Bits außer den ersten 8 auf 0 gesetzt werden, wodurch eine positive Zahl garantiert wird:quelle
int a
. Wenn Sie also haben& 0xFF
, müssen Sie überhaupt nicht wirken.int a = (0b11010100<< 1) & 0xFF;
Wenn Sie alle Bits auf 0 setzen möchten, die höher als die unteren 8 Bits sind, können Sie das bitweise UND verwenden:
Ausgabe:
quelle
Versuchen Sie so etwas:
toUnsignedInt wurde in Java SE 8 eingeführt.
quelle