Dlaczego, kiedy próbuję przesunąć bity dla 11010100 2 , wynik to 110101000 2 , a nie 10101000 2 .
int a = Integer.parseInt("11010100", 2) << 1;
Próbuję to zrobić:
int a = (byte)(Integer.parseInt("11010100", 2) << 1);
Ale jeśli wartość wyjściowa jest większa niż 128, wszystko idzie w minus, co jest logiczne. Jak mogę sprawić, że ta liczba bitów się nie zmienia?
int
s lublong
s.Odpowiedzi:
Zróbmy to krok po kroku.
Integer.parseInt("11010100", 2)
- to jest wartość int 212. Nawiasem mówiąc, jest to niepotrzebne; można po prostu napisać:0b11010100
.0b11010100 << 1
jest taki sam jak0b110101000
i wynosi 424.Następnie wrzucił je do bajta:
(byte)(0b11010100 << 1)
. Wszystkie bity poza pierwszymi 8 są usuwane, co pozostawia 0b10101000, czyli -88. Minus, tak, ponieważ w java bajty są podpisane.Następnie po cichu rzutujesz to -88 z powrotem na int, przypisując go do wartości int. Pozostaje -88, co oznacza, że wszystkie górne bity to wszystkie 1.
Dlatego ostateczna wartość to
-88
.Jeśli chcesz zobaczyć
168
zamiast tego (dokładnie te same bity, ale pokazane bez znaku zamiast z podpisem), zwykle używa się sztuczki& 0xFF
, która ustawia wszystkie bity z wyjątkiem pierwszych 8 na 0, gwarantując w ten sposób liczbę dodatnią:źródło
int a
, więc jeśli masz& 0xFF
, to nie musisz w ogóle rzucać.int a = (0b11010100<< 1) & 0xFF;
Jeśli chcesz ustawić 0 na wszystkie bity wyższe niż dolne 8 bitów, możesz użyć bitów ORAZ:
Wynik:
źródło
Wypróbuj coś takiego:
toUnsignedInt został wprowadzony w Javie SE 8.
źródło