JavaRush /Blog Java /Random-PL /Negacja bitowa - dlaczego tak jest?
Alex Bolgov
Poziom 37
Ташкент

Negacja bitowa - dlaczego tak jest?

Opublikowano w grupie Random-PL
Witam wszystkich :) Czytając artykuł Operacje bitowe, podobnie jak niektórzy, zadałem sobie pytanie: dlaczego po odwróceniu liczby 342 otrzymamy -343. Tak to wygląda w artykule: Negacja bitowa - dlaczego tak - 1Szczególnie dociekliwi (jak ja) mają pytanie: „hej, ale 010101001 jest mniejsze niż 101010110, logiczne jest, że powinno być mniejsze niż 342 i dodatnie”. Wpisując go w dowolny internetowy konwerter numerów lub sprawdzając za pomocą kodu:
Integer a = Integer.valueOf("010101001", 2);
System.out.println(Integer.toString(a, 10));
nieoczekiwanie otrzymujemy coś innego niż -343...
169
Och, jak dobrze, że pewnego razu na zajęciach z programowania w C jakimś cudem usłyszałem coś o cyfrze znaku w liczbach całkowitych. Po pewnym czasie googlowania mogę teraz wyjaśnić, co to za zwierzę. Negacja bitowa - dlaczego tak - 2Rzeczywiście w artykule jest nieścisłość, która wprowadza zamieszanie. Jeśli sprawdzimy z kodem, jaki jest tak naprawdę wynik odwrócenia liczby 342:
int a = 342;
System.out.println(Integer.toBinaryString(~a));
wtedy zobaczymy nieco inny wynik
111111111111111111111111010101001
Dlaczego tak jest? Rzecz w tym, że zmienna nie może po prostu zawierać 101010110; w rzeczywistości jest przechowywana jako
000000000000000000000000101010110
W końcu zmienna int zajmuje 4 bajty, tj. 32 bity - 32 komórki pamięci. Po inwersji zmieniają się absolutnie wszystkie liczby, tj. i „przycięte” zera wiodące. Teraz zaczyna się zabawa. Ponieważ w reprezentacji binarnej nie można zapisać znaku + lub - przed liczbą, istnieje jedna sztuczka: już pierwszy bit jest w rzeczywistości odpowiedzialny za znak i jest dokładnie bitem znaku . I wszystkie liczby są przechowywane według tej logiki: liczby od 00...000 do 01...111 są dodatnie, zaczynając od 0 (czyli od 0 do 2147483647) i zaczynając od 10...000 do 11...111 są ujemne, zaczynając od najmniejszej i kończąc na -1 (tj. -2147483648 do -1).
00000000000000000000000000000000 = 0
01111111111111111111111111111111 = 2147483647
10000000000000000000000000000000 = -2147483648
11111111111111111111111111111111 = -1
A potem pytasz: „OK, Nawalny, wierzymy ci, ale dlaczego zdecydowałeś, że to jego pałac”, ale jak to się ma do -343 z tym wszystkim? To naprawdę proste. Możemy to po prostu obliczyć ręcznie. Jeśli „odetniemy” (lub zastąpimy 0) już pierwszy bit z wersji binarnej wynikowej liczby 342 ( 11111111111111111111111111111111111111010101001 ) i przywrócimy ją do postaci dziesiętnej.
String s = "01111111111111111111111010101001";
System.out.println(s + " = " + Integer.toString(Integer.valueOf(s, 2), 10));
wtedy to zrozumiemy
01111111111111111111111010101001 = 2147483305
Tak naprawdę tutaj nie tylko „odcięliśmy” 1 na początku, ale odjęliśmy od tej liczby 10000000000000000000000000000000. Teraz dodajmy to z powrotem, ale w formie dziesiętnej. Co zobaczymy:
~342 =
11111111111111111111111010101001 =
//в двоичном виде//
01111111111111111111111010101001 +
10000000000000000000000000000000
=
//в десятичном виде//
-2147483648 + 2147483305 = -343
Oto wymagana liczba -343 :) Kochani to mój pierwszy post tutaj, proszę o polubienie jeśli się spodobał i był pouczający (naprawdę chcę zebrać wszystkie osiągnięcia 😄) Więcej na ten temat przeczytacie tutaj: Życzę wszystkim powodzenia i dziękuję za uwagę)
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION