Jak działa bitowy operator dopełniacza (~tilde)?

Dlaczego ~2 jest równe -3? Jak działa operator ~?

Author: Pshemo, 2009-04-26

12 answers

Pamiętaj, że liczby ujemne są przechowywane jako dopełniacz dwójki dodatniego odpowiednika. Jako przykład, oto reprezentacja -2 w dopełniaczu two: (8 bitów)

1111 1110

Sposób, w jaki można to uzyskać, polega na pobraniu binarnej reprezentacji liczby, pobraniu jej dopełnienia (odwrócenie wszystkich bitów) i dodaniu jednego. Dwa zaczyna się jako 0000 0010, a odwracając bity otrzymujemy 1111 1101. Dodanie jednego daje nam wynik powyżej. Pierwszy bit to bit znakowy, oznaczający nie.

Przyjrzyjmy się więc, jak otrzymujemy ~2 = -3:

Znowu dwa:

0000 0010

Po prostu odwróć wszystkie bity i otrzymamy:

1111 1101
Jak wygląda -3 w dopełniaczu dwójki? Zacznij od dodatniego 3: 0000 0011, Odwróć wszystkie bity do 1111 1100 i dodaj jeden, aby uzyskać wartość ujemną( -3), 1111 1101.

Więc jeśli po prostu odwrócisz bity w 2, otrzymasz reprezentację dopełniacza -3.

Operator dopełniacza (~) po prostu odwraca bity. Informatyka jest do maszyny, aby zinterpretować te bity.

 244
Author: Anthony,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-16 10:25:16

~ odwraca bity wartości.

Dlaczego ~2 jest -3 ma związek z tym, jak liczby są reprezentowane bitowo. Liczby są reprezentowane jako dopełniacz dwójki .

Zatem 2 jest wartością binarną

00000010

I ~2 odwraca bity, więc wartość jest teraz:

11111101

, która jest binarną reprezentacją -3.

 33
Author: driis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-23 14:51:17

Jak inni wspomnieli ~ po prostu odwrócone bity (zmienia jeden na zero i zero na jeden) i ponieważ dopełniacz two jest używany, otrzymujesz wynik, który widziałeś.

Należy dodać jedną rzecz Dlaczego dopełniacz dwójki jest używany, to jest tak, że operacje na liczbach ujemnych będą takie same jak na liczbach dodatnich. Pomyśl o {[2] } jako liczbie, do której 3 należy dodać, aby otrzymać zero, a zobaczysz, że liczba ta jest 1101, pamiętaj, że dodawanie binarne jest tak samo elementary school (dziesiętny) dodatek tylko nosisz jeden, gdy dojdziesz do dwóch, a nie 10.

 1101 +
 0011 // 3
    =
10000
    =
 0000 // lose carry bit because integers have a constant number of bits.

Zatem 1101 jest -3, Odwróć bity, które otrzymujesz 0010, czyli dwa.

 14
Author: Motti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-26 20:04:18

Operacja ta jest dopełnieniem, a nie negacją.

Weź pod uwagę, że ~0 = -1 i pracuj dalej.

Algorytm negacji to: "dopełnienie, przyrost".

Czy wiesz? Istnieje również "dopełnienie", gdzie liczby odwrotne symetryczne, i ma zarówno 0, jak i -0.

 9
Author: gbarry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-26 20:22:13

Int a = 4; System.Wynocha.println (~a); Wynik będzie :-5

'~' dowolnej liczby całkowitej w Javie reprezentuje dopełnienie 1 Liczby nie. na przykład biorę ~4, co oznacza w reprezentacji binarnej 0100. pierwszy , długość liczby całkowitej wynosi cztery bajty, tzn. 4*8 (8 bitów dla 1 bajtu)=32. Tak więc w pamięci systemowej 4 jest reprezentowana jako 0000 0000 0000 0000 0000 0000 0000 0100 teraz ~ operator wykona dopełnienie 1 na powyższym binarnym no

I. e 1111 1111 1111 1111 1111 1111 1111 1011->1 dopełnienie najbardziej znaczący bit reprezentuje znak Nie (albo - albo +) jeśli jest 1 to znak jest' -' jeśli jest 0 to znak jest'+' jak na to nasz wynik jest liczbą ujemną, w języku java liczby ujemne zapisywane są w postaci dopełniacza 2, uzyskany wynik musimy przekształcić w dopełniacz 2( najpierw wykonaj dopełniacz 1 i po prostu dodaj dopełniacz 1 do 1). wszystkie one staną się zerami, z wyjątkiem najbardziej znaczącego bitu 1 (który jest naszą reprezentacją znaku liczby, czyli dla pozostałych 31 bity 1111 1111 1111 1111 1111 1111 1111 1011 (uzyskany wynik ~ operator) 1000 0000 0000 0000 0000 0000 0000 0100 (1 dopełniacz)

1 (dopełniacz 2)

1000 0000 0000 0000 0000 0000 0000 0101 teraz wynik to -5 zobacz ten link do filmu https://youtu.be/w4pJ4cGWe9Y

 4
Author: Film geek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-14 07:21:27

Wiem, że odpowiedź na to pytanie jest zamieszczona dawno temu, ale chciałem podzielić się swoją odpowiedzią na to samo.

Aby znaleźć dopełnienie jedynki liczby, najpierw znajdź jej binarny odpowiednik. W tym przypadku liczba dziesiętna 2 jest reprezentowana jako 0000 0010 w postaci binarnej. Teraz przyjmuje dopełnienie jedynki przez odwrócenie (odwrócenie wszystkich 1 do 0 i wszystkich 0 do 1) wszystkich cyfr jego reprezentacji binarnej, co spowoduje:

0000 0010 → 1111 1101

To jest dopełnienie dziesiętne jedynki numer 2. A ponieważ pierwszy bit, tzn. bit znaku jest 1 w liczbie binarnej, oznacza to, że znak jest ujemny dla przechowywanej liczby. (tutaj Liczba, o której mowa, to nie 2, ale dopełnienie jedynki z 2).

Teraz, ponieważ liczby są przechowywane jako dopełnienie 2 (biorąc dopełnienie jedynki liczby plus jedynki), więc aby wyświetlić tę liczbę binarną, 1111 1101, w dziesiętnym, najpierw musimy znaleźć dopełnienie dwójki, które będzie:

1111 1101 → 0000 0010 + 1 → 0000 0011

To jest 2 ' S / align = "left" / Reprezentacja dziesiętna liczby binarnej, 0000 0011, to 3. A ponieważ bit znaku był taki, jak wspomniano powyżej, więc otrzymaną odpowiedzią jest -3.

Hint: Jeśli uważnie przeczytasz tę procedurę, zauważysz, że wynikiem dla operatora dopełniacza jedynki jest w rzeczywistości liczba (operand - na którą ten operator jest stosowany) plus Jedynka ze znakiem ujemnym. Możesz spróbować z innymi numerami.

 3
Author: Himanshu Aggarwal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-04 18:40:10

Po prostu ...........

Jako dopełnienie 2 dowolnej liczby możemy obliczyć odwracając wszystkie 1s do 0 i odwrotnie niż dodajemy do niego 1..

Tutaj n = ~ n daje wyniki -(N+1) zawsze. Ponieważ system przechowuje dane w postaci dopełnienia 2, co oznacza, że przechowuje ~N w ten sposób.

  ~N = -(~(~N)+1) =-(N+1). 

Na przykład::

  N = 10  = 1010
  Than ~N  = 0101
  so ~(~N) = 1010
  so ~(~N) +1 = 1011 

Teraz chodzi o to, skąd bierze się Minus. Moim zdaniem mamy rejestr 32 bitowy czyli 2^31 -1 bit zaangażowany w działanie i do odpoczynku jeden bit które zmiany we wcześniejszych obliczeniach (dopełniaczach) zapisywane są jako bit znaku, który zwykle wynosi 1. I otrzymujemy wynik jako ~10 = -11.

~(-11) =10 ;

Powyższe jest prawdziwe jeśli printf ("%d",~0); otrzymujemy wynik: -1;

Ale printf("%u",~0) niż wynik: 4294967295 na maszynie 32-bitowej.

 2
Author: shubham kumar Mishra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-29 09:52:31

Operator dopełniacza bitowego (~) jest operatorem unarnym .

Działa zgodnie z następującymi metodami

Najpierw zamienia podaną liczbę dziesiętną na odpowiadającą jej binarną wartość.Oznacza to, że w przypadku 2 najpierw konwertuje 2 na 0000 0010 (na 8 bitową liczbę binarną).

Następnie zamienia wszystkie 1 w liczbie na 0, a wszystkie zera na 1;wtedy liczba stanie się 1111 1101.

Jest to reprezentacja dopełniacza 2 równa -3.

W aby znaleźć niepodpisaną wartość za pomocą dopełniacza, tzn. po prostu przekonwertować 1111 1101 na dziesiętne (=4294967293) możemy po prostu użyć %u podczas drukowania.

 1
Author: james.bondu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-18 10:36:22

Myślę, że dla większości ludzi część zamieszania wynika z różnicy między liczbą dziesiętną a podpisaną liczbą binarną, więc wyjaśnijmy to najpierw:

Dla ludzkiego świata dziesiętnego: 01 oznacza 1, -01 oznacza -1, dla świata binarnego komputera: 101 oznacza 5, jeśli jest niepodpisany. 101 oznacza (-4 + 1), jeśli jest podpisana, podczas gdy podpisana cyfra znajduje się na pozycji x. | x

So 2 ' S flipped bit = ~2 = ~(010) = 101 = -4 + 1 = -3 zamieszanie wynika z pomieszania podpisanego wyniku (101=-3) i nieszyfrowanego result(101=5)

 1
Author: user7537910,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-09 04:16:24

Najpierw musimy podzielić daną cyfrę na jej cyfry binarne, a następnie odwrócić ją dodając na ostatniej cyfrze binarnej.Po tym wykonaniu musimy dać znak przeciwny do poprzedniej cyfry, który znajdujemy w komplecie ~2=-3 Wyjaśnienie: 2s forma binarna to 00000010 zmienia się na 11111101 to jest dopełniacz jedynek, a następnie dopełniacz 00000010 + 1=00000011 co jest formą binarną trójki i ze znakiem tzn. -3

 0
Author: balusabavath,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-11 15:47:24

Operator bitowy jest operatorem jednostkowym, który działa na metodzie znaku i wielkości zgodnie z moim doświadczeniem i wiedzą.

Na przykład ~2 spowoduje -3.

Jest to spowodowane tym, że operator bitowy najpierw reprezentuje liczbę w znaku i wielkości, która jest 0000 0010 (operator 8-bitowy), gdzie MSB jest bitem znaku.

Potem przyjmowałaby ujemną liczbę 2, która wynosi -2.

-2 jest reprezentowany jako 1000 0010 (operator 8-bitowy) w znaku i wielkość.

Później dodaje 1 do LSB (1000 0010 + 1), co daje 1000 0011.

Czyli -3.

 0
Author: Santhosh Kumar Jhadav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-27 18:40:50

Tylda Javascript ( ~ ) przymusza daną wartość do dopełniacza-wszystkie bity są odwrócone. Tylko to robi tilde. / Align = "left" / Nie dodaje ani nie odejmuje żadnej ilości.

0 -> 1
1 -> 0
...in every bit position [0...integer nbr of bits - 1]

W standardowych procesorach desktopowych wykorzystujących języki wysokiego poziomu, takie jak JavaScript, arytmetyka podpisana BASE10 jest najczęstszą, ale należy pamiętać, że nie jest to jedyny rodzaj. Bity na poziomie procesora podlegają interpretacji opartej na wielu czynnikach. Na poziomie "kodu", w tym przypadku JavaScript są one z definicji interpretowane jako 32-bitowa, podpisana liczba całkowita(zostawmy to w spokoju). Potraktuj to jako kwant, te 32-bity reprezentują wiele możliwych wartości na raz. To zależy całkowicie od konwertującego obiektywu, przez który je oglądasz.

JavaScript Tilde operation (1's complement)

BASE2 lens
~0001 -> 1110  - end result of ~ bitwise operation

BASE10 Signed lens (typical JS implementation)
~1  -> -2 

BASE10 Unsigned lens 
~1  -> 14 

Wszystkie powyższe są prawdziwe w tym samym czasie.

 0
Author: Elvn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-30 14:51:02