Tentei pesquisar usando a Pesquisa do Google e o estouro de pilha, mas ele não apresentou nenhum resultado. Eu já vi isso no código da biblioteca de código-fonte aberto:
Notification notification = new Notification(icon, tickerText, when);
notification.defaults |= Notification.DEFAULT_SOUND;
notification.defaults |= Notification.DEFAULT_VIBRATE;
O que significa "| =" ( pipe equal operator
)?
pipe equal operator
a esta pergunta ou qualquer outra documentação sobre o tópico não ajudaria as pessoas a pesquisar.vertical bar
que finalmente me levou até aqui.Respostas:
|=
lê da mesma maneira que+=
.é o mesmo que
onde
|
é o operador OR bit a bit.Todos os operadores são referenciados aqui .
Um operador bit a bit é usado porque, como é frequente, essas constantes permitem que um int carregue sinalizadores.
Se você olhar para essas constantes, verá que elas têm poderes de dois:
Então você pode usar OR bit a bit para adicionar sinalizadores
tão
simplesmente significa que adicionamos uma bandeira.
E simetricamente, testamos que um sinalizador é definido usando
&
:fonte
j += 1;
é o mesmo quej = j + 1;
.j
forvolatile
?), Mas vou aceitar sua palavra.boolean hasVibrate = DEFAULT_VIBRATE & myFlags;
- você pode traduzir deint
paraboolean
assim em Java? Isso seria válido em C, mas eu pensei que em Java tinha que ser escrito comoboolean hasVibrate = ((DEFAULT_VIBRATE & myFlags) == DEFAULT_VIBRATE);
+=
finalmente fez o truque para eu entender. Obrigado!Você já tem resposta suficiente para sua pergunta. Mas pode ser minha resposta ajudá-lo mais sobre o
|=
tipo de operadores binários.Estou escrevendo tabela para operadores bit a bit : A
seguir, são válidos:
note que todos os operadores são operadores binários.
Também Nota: (para abaixo pontos que eu queria acrescentar a minha resposta)
>>>
é um operador bit a bit em Java chamado deslocamento não assinadomas>>> = operador>>>=
não um operador em Java.~
é bits de complemento bit a bit,0 to 1 and 1 to 0
(operador unário), mas~=
não um operador.Além disso,
!
chamado operador lógico NÃO, mas!=
verifica se o valor de dois operandos é igual ou não, se os valores não são iguais, a condição se torna verdadeira. por exemplo(A != B) is true
. onde comoA=!B
significa seB
étrue
entãoA
se tornafalse
(e seB
éfalse
entãoA
se tornatrue
).nota lateral:
|
não é chamado pipe, em vez disso é chamado OR, pipe é terminologia de shell, transfere um processo para o próximo.fonte
Eu estava procurando uma resposta sobre o que
|=
faz no Groovy e, embora as respostas acima estejam corretas, elas não me ajudaram a entender um pedaço de código específico que eu estava procurando.Em particular, quando aplicada a uma variável booleana "| =", ela será configurada como TRUE na primeira vez em que encontrar uma expressão verdadeira no lado direito e manterá seu valor TRUE para todas as chamadas subsequentes. Como uma trava.
Aqui está um exemplo simplificado disso:
Resultado:
Edit : Por que isso é útil?
Considere uma situação em que você deseja saber se algo mudou em uma variedade de objetos e, em caso afirmativo, notifique alguma dessas alterações. Então, você configuraria um
hasChanges
booleano e o definiria para|= diff (a,b)
então|= dif(b,c)
etc. Aqui está um breve exemplo:fonte
y|=expr
é um curto-circuito (ao contrárioy = y || expr
), o que significa queexpr
sempre é avaliada. Isso não foi óbvio para mim pela primeira vez :) Portanto, é importante observar antes de refatorar que a substituiçãoy|=expr
↔ nãoy=y||x
é semanticamente equivalente , casoexpr
realmente tenha efeitos colaterais.hasChanges
ele iria provavelmente ser melhor a preferiry=y||x
formulário para beneficiar a curto ciruit, porque quando você encontrou qualquer mudança não é realmente necessário para fazer diffs susequent porque você já sabe a resposta. (Especialmente importante na situação da vida real quando os objetos comparados são complicados ediff
ing-los eles não é muito rápido)||
e&&
, e nas seções correspondentes 15.23 e 15.24 da especificação, esse fato é claramente declarado, e essa diferença de|
e&
é enfatizada.||=
e&&=
que seriam infringir a regra e exigir menção especial).É um encurtamento para isso:
E
|
é um pouco sábio OU.fonte
|
é o operador bit a bit - ou , e está sendo aplicado como+=
.fonte
Nota: || = não existe. (lógico ou) Você pode usar
ou
fonte
y |= expr
com booleanos e ele fornece o mesmo resultadoy
que suas variantes, com a nota importante de que não é curto-curto , o que significa que o expr sempre é avaliado, mesmo no caso dey==true