Oto praca, którą wykonałem do tej pory:

2 ^ 32 = 10 ... 0

Odejmij 1 -> 01 ... 1 To daje 32 1

1 = 01

Odwróć bity -> 11 .... 10 dodaj 1-> 1 ... 1 To daje 32 jedynki

Czy czegoś mi brakuje? Pytam, ponieważ wypróbowałem praktykę problem, w której trzeba było wszystko odwrócić binarne bity liczby. XOR z -1 nie zadziałał, ale XOR z 2^32 - 1 zadziałał.

0
user12178194 20 grudzień 2019, 04:38

3 odpowiedzi

Liczba uzupełnień do 32-bitowych 2 może reprezentować tylko wartości z (włącznie) zakresu - (2 ^ 31) .. (2 ^ 31) -1. Ponieważ 2 ^ 32-1 nie mieści się w tym zakresie, ma się rozumieć, że dowolny wzorzec bitowy, który dla niego wymyślisz, w rzeczywistości odpowiada wartości, która ma .

0
Scott Hunter 20 grudzień 2019, 04:46

Ponumerujmy 32 cyfry liczby int, od 0 do 31. Cyfra # 0 oznacza 2⁰, cyfra # 1 reprezentuje 2¹, itd. Bardziej ogólnie, cyfra # n reprezentuje 2ⁿ.

Ale mamy tylko cyfry do 31: mamy 32 cyfry, ale zaczęliśmy liczyć od 0 . Nie ma 32. cyfry do utworzenia 2³².

Więc co robi komputer? Zasadniczo udaje, że napisałeś 2³², ale następnie usuwa wszystkie oprócz pierwszych 32 cyfr (cyfry 0-31). Nazywa się to przepełnieniem liczby całkowitej. Oznacza to, że 2³², które „powinno” być 1, po którym następuje 32 zer, to w rzeczywistości tylko 32 zer – co oczywiście równa się 0. Odejmij od tego 1, a otrzymasz -1.

Jeśli pracujesz z wartościami long (nie int), masz 64 bity zamiast 32. W takim przypadku przepełnienie nie występuje na bicie 32, a okaże się, że 2³² - 1 nie równa się -1: równa się 4294967295, tak jak można się spodziewać. Ale w tym przypadku 2⁶⁴ to 0 z podobnych powodów.

0
yshavit 20 grudzień 2019, 04:55
Doceniam wszystkie odpowiedzi, ale to jest idealne, dziękuję! Czy istnieje powód, dla którego samo użycie -1, jak próbowałem, nie działałoby z długimi?
 – 
user12178194
20 grudzień 2019, 06:43
Przepraszam, nie rozumiem pytania. Czy możesz pokazać, co masz na myśli pod względem kodu?
 – 
yshavit
20 grudzień 2019, 07:55
Nieważne, przeczytaj ponownie swoją odpowiedź i została wyjaśniona, dzięki
 – 
user12178194
4 styczeń 2020, 03:54

Aby utworzyć dowolną liczbę w postaci dopełnienia do 2, odwróć bity i dodaj 1.

Więc dla -1 jest to następujące

1 = 00000000000000000000000000000001
flip those bits
       11111111111111111111111111111110
add 1 to it and you get
       11111111111111111111111111111111

Dlaczego to jest -1?

Cóż, -1 + 1 = 0.

Jeśli dodasz razem następujące elementy, otrzymasz

       11111111111111111111111111111111
      +00000000000000000000000000000001

Robisz trochę przeniesienia do następnej pozycji po lewej stronie, ostatecznie przepełniając pole i pozostaje ci 0.

       00000000000000000000000000000000
0
WJS 20 grudzień 2019, 05:06