Java: co oznacza ~

W tym kodzie źródłowym Javy mam taką linijkę:

if ((modifiers & ~KeyEvent.SHIFT_MASK) != 0) ....
Co oznacza tylda?
Author: Eric Leschinski, 2009-09-27

5 answers

Tylda (~) wykonuje bitowe uzupełnienie wartości liczbowej w Javie.

Zobacz: dopełniacz bitowy (~): odwraca jedynki i zera w liczbie

 62
Author: Richard,
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
2018-02-04 07:36:59

Jest to unary ~ bitowe dopełniacz operator (cytowanie) :

  • używane tylko z wartościami całkowitymi
  • odwraca bity, tzn. 0-bit staje się 1-bitowym i odwrotnie
  • we wszystkich przypadkach ~x równa się (-x)-1

Zobacz także tę stronę o operatorach bitowych na Wikipedii , która stwierdza :

Bitowe Nie, czyli dopełnienie, jest operacja jednolita wykonująca logiczne negacja na każdym bitie, tworząc dopełnienie jednej z dane binarne wartość. Cyfry, które były 0 stały się 1, i vice versa.
na przykład:

NOT 0111  (decimal 7)
  = 1000  (decimal 8)

W wielu językach programowania (łącznie z tymi z rodziny C) , operatorem bitowym NOT jest " ~" tylda).

 46
Author: Pascal MARTIN,
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-07-28 02:57:29

Ze strony Javy http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html

Unary bitowy Operator dopełniacza " ~ " odwraca wzór bitowy; to może być stosowany do dowolnego typu całek, dzięki czemu każde " 0 " a " 1" i każde " 1 " a "0". Na przykład bajt zawiera 8 bitów; zastosowanie operator ten do wartości, której wzorzec bitowy to "00000000" zmieniłby jego wzór na "11111111".

Teraz, jak wcześniej odpowiedział Pascal MARTIN, w w każdym przypadku vlaue jest równe- (x) -1. E. g. ~2=-3, ~-6=5, itd.

Również w Javie wszystkie dodatnie liczby całkowitesą przechowywane jako ich reprezentacje binarne, a ujemne liczby całkowite są przechowywane w wartości komplementarnej 2 dodatniej liczby całkowitej.

Teraz, zobaczmy jak to działa na poziomie bitów w przypadku ~2=-3:

Początkowo, 2 jest przechowywane w swojej binarnej reprezentacji:

0000 0000 0000 0010

Teraz ~2 spowoduje wartość (odwrócenie bitów):

1111 1111 1111 1101

Jak w świat wiem, że jest -3? Cóż, jest -3, ponieważ pochodzi z reprezentacji komplementarnej 2 na 3.

Jak wiemy 2 'S (x)= 1' s (x) + 1 (https://delightlylinux.wordpress.com/2014/10/13/binary-lesson-12-ones-complement-and-twos-complement/)
naszym celem jest znalezienie x :
1 's (x)= 2' S (x) - 1 (na podstawie poprzedniego wyrażenia)

Jak nasza odpowiedź jest w komplemencie 2,
1 ' S (x)= 1111 1111 1111 1101 - 0000 0000 0000 0001
1 ' s (x)= 1111 1111 1111 1100 (Jak odjąć - http://sandbox.mc.edu / ~bennet/cs110/pm/sub.html)

Zatem komplement wartości x= 1 (ponieważ otrzymana odpowiedź reprezentuje komplement wartości x).
x = 0000 0000 0000 0011
tak więc, odkryliśmy, że x jest 3 i stąd nasz poprzedni wynik operatora ~ 1111 1111 1111 1101 jest -3 zapisywany jako komplement 2 z 3.

 8
Author: Dhwaneel,
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-18 05:30:50

Jak wspomniano wcześniej ~ jest operatorem jednostkowym bitowym NOT.
Twój przykład sprawdza, czy modifiers zawiera bity inne niż te zdefiniowane w KeyEvent.SHIFT_MASK.

  • ~KeyEvent.SHIFT_MASK - > wszystkie bity oprócz tych w KeyEvent.SHIFT_MASK są ustawione na 1.
  • (modifiers & ~KeyEvent.SHIFT_MASK) -> Każdy 1-bit w modifiers, który "nie należy" do KeyEvent.SHIFT_MASK
  • if ((modifiers & ~KeyEvent.SHIFT_MASK) != 0) - > jeśli był przynajmniej jeden inny bit ustawiony na 1 poza KeyEvent.SHIFT_MASK Zrób coś...
 8
Author: VolkerK,
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
2018-02-04 07:37:19

Z oficjalnych dokumentów http://java.sun.com/docs/books/tutorial/java/nutsandbolts/op3.html :

Jednoargumentowy Operator dopełniacza " ~ "odwraca wzór bitowy; można go zastosować do dowolnego typu całek, czyniąc każde" 0 " a " 1 "i każde" 1 "A " 0". Na przykład bajt zawiera 8 bitów; zastosowanie tego operatora do wartości, której wzorzec bitowy to "00000000", zmieniłoby jego Wzorzec na"11111111".

 3
Author: Alberto Zaccagni,
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-09-27 12:42:07