Próbowałem szukać za pomocą wyszukiwarki Google i przepełnienia stosu, ale nie przyniosło to żadnych wyników. Widziałem to w kodzie biblioteki opensource:
Notification notification = new Notification(icon, tickerText, when);
notification.defaults |= Notification.DEFAULT_SOUND;
notification.defaults |= Notification.DEFAULT_VIBRATE;
Co oznacza „| =” ( pipe equal operator
)?
pipe equal operator
do tego pytania lub jakiejkolwiek innej dokumentacji na ten temat nie pomogłoby ludziom w wyszukiwaniu.vertical bar
który w końcu mnie tu doprowadził.Odpowiedzi:
|=
czyta tak samo jak+=
.jest taki sam jak
gdzie
|
jest bitowym operatorem LUB.Wszystkie operatory są tutaj wymienione .
Używany jest operator bitowy, ponieważ, jak to często bywa, te stałe umożliwiają int przenoszenie flag.
Jeśli spojrzysz na te stałe, zobaczysz, że mają potęgę dwóch:
Możesz więc użyć bitowej LUB do dodania flag
więc
oznacza po prostu, że dodajemy flagę.
I symetrycznie testujemy flagę ustawioną za pomocą
&
:źródło
j += 1;
jest to samoj = j + 1;
.j
jestvolatile
?), Ale uwierzę ci na słowo.boolean hasVibrate = DEFAULT_VIBRATE & myFlags;
- można tłumaczyć zeint
doboolean
takiego w Java? To byłoby ważne w C, ale pomyślałem, że w Javie musi być napisany jakoboolean hasVibrate = ((DEFAULT_VIBRATE & myFlags) == DEFAULT_VIBRATE);
+=
ostatecznie pomogło mi zrozumieć. Dzięki!Masz już wystarczającą odpowiedź na swoje pytanie. Ale może moja odpowiedź pomoże ci bardziej na temat
|=
operatorów binarnych.Piszę tabelę dla operatorów bitowych :
Następujące są poprawne:
Uwaga: wszyscy operatorzy są operatorami binarnymi.
Również uwaga: (poniżej punktów chciałem dodać moją odpowiedź)
>>>
jest bitowym operatorem w Javie o nazwie Przesunięcie niepodpisaneale>>> = operator>>>=
nie operator w Javie.~
to bitowe uzupełnienie bitowe0 to 1 and 1 to 0
(operator jednoargumentowy), ale~=
nie operator.Dodatkowo
!
nazywany logicznym operatorem NOT, ale!=
sprawdza, czy wartość dwóch argumentów jest równa, czy nie, jeśli wartości nie są równe, wówczas warunek staje się prawdziwy. np(A != B) is true
. gdzie jakoA=!B
środek jeśliB
jesttrue
następnieA
sięfalse
(jeśliB
jestfalse
wtedyA
staćtrue
).uwaga dodatkowa:
|
nie jest nazywana potokiem, a zamiast niej OR, potok jest terminologią powłoki przenoszącą jeden proces do następnego ..źródło
Szukałem odpowiedzi na pytanie, co
|=
robi Groovy i chociaż powyższe odpowiedzi są prawidłowe, nie pomogły mi zrozumieć konkretnego fragmentu kodu, na który patrzyłem.W szczególności, po zastosowaniu do zmiennej logicznej „| =” ustawi ją na PRAWDA, kiedy po raz pierwszy napotka prawdziwe wyrażenie po prawej stronie i zatrzyma swoją PRAWDZIWĄ wartość dla wszystkich | = kolejnych wywołań. Jak zatrzask.
Oto uproszczony przykład tego:
Wynik:
Edycja : Dlaczego to jest przydatne?
Rozważ sytuację, w której chcesz wiedzieć, czy coś się zmieniło na różnych obiektach, a jeśli tak, powiadom jedną ze zmian. Tak więc
hasChanges
ustawilibyśmy wartość logiczną,|= diff (a,b)
a następnie|= dif(b,c)
itd. Oto krótki przykład:źródło
y|=expr
powoduje zwarcia (w przeciwieństwie doy = y || expr
), co oznacza, żeexpr
zawsze oceniana. Nie było to dla mnie oczywiste po raz pierwszy :) Dlatego przed refaktoryzacją należy zauważyć, że zamianay|=expr
↔ niey=y||x
jest semantycznie równoważna w przypadku, gdyexpr
rzeczywiście ma skutki uboczne.hasChanges
niego będzie zapewne lepiej byłoby woląy=y||x
formę do korzystania z krótkim ciruit, bo kiedy znaleziono żadnych zmian nie jest to rzeczywiście potrzebne, aby zrobić susequent dyferencjału bo znasz już odpowiedź. (Jest to szczególnie ważne w rzeczywistej sytuacji, gdy porównywane obiekty są skomplikowane, adiff
ich wprowadzanie nie jest dość szybkie)||
i&&
, w odpowiednich rozdziałach 15.23 i 15.24 specyfikacji fakt ten jest wyraźnie oświadczył i ta różnica z|
i&
jest podkreślona.||=
i&&=
operatorów, którzy by złamać zasadę i wymagać specjalnego wzmianki).Jest to skrócenie tego:
I
|
jest nieco mądry LUB.źródło
|
jest operatorem bitowym lub operatorem i jest stosowany jak+=
.źródło
Uwaga: || = nie istnieje. (logiczne lub) Możesz użyć
lub
źródło
y |= expr
z wartościami logicznymi i daje to ten sam wynik,y
co twoje warianty, z ważną uwagą, że nie jest krótki , co oznacza, że wyrażenie jest zawsze oceniane, nawet w przypadkuy==true