Java 什么是|=&引用;什么意思?(管道相等运算符)
我尝试使用谷歌搜索和StackOverflow进行搜索,但没有显示任何结果。我在开源库代码中看到了这一点:Java 什么是|=&引用;什么意思?(管道相等运算符),java,android,operators,Java,Android,Operators,我尝试使用谷歌搜索和StackOverflow进行搜索,但没有显示任何结果。我在开源库代码中看到了这一点: Notification notification = new Notification(icon, tickerText, when); notification.defaults |= Notification.DEFAULT_SOUND; notification.defaults |= Notification.DEFAULT_VIBRATE; “|=”(pipe equal o
Notification notification = new Notification(icon, tickerText, when);
notification.defaults |= Notification.DEFAULT_SOUND;
notification.defaults |= Notification.DEFAULT_VIBRATE;
“|=”(
pipe equal operator
)是什么意思?|=
的读取方式与+=
相同
notification.defaults |= Notification.DEFAULT_SOUND;
与
notification.defaults = notification.defaults | Notification.DEFAULT_SOUND;
其中,|
是位OR运算符
所有运算符都被引用
之所以使用位运算符,是因为这些常量经常使int能够携带标志
如果你看看这些常数,你会发现它们是二的幂:
public static final int DEFAULT_SOUND = 1;
public static final int DEFAULT_VIBRATE = 2; // is the same than 1<<1 or 10 in binary
public static final int DEFAULT_LIGHTS = 4; // is the same than 1<<2 or 100 in binary
所以
简单的意思是我们添加了一个标志
对称地,我们使用&
测试标志的设置:
boolean hasVibrate = (DEFAULT_VIBRATE & myFlags) != 0;
这是一个缩写:
notification.defaults = notification.defaults | Notification.DEFAULT_SOUND;
而
|
是一个位智能的OR。
是运算符,它的应用方式类似于+=
你的问题已经有了足够的答案。但我的答案可能会帮助你更多地了解|=
类二进制运算符
我正在为:以下各项有效:
----------------------------------------------------------------------------------------
Operator Description Example
----------------------------------------------------------------------------------------
|= bitwise inclusive OR and assignment operator C |= 2 is same as C = C | 2
^= bitwise exclusive OR and assignment operator C ^= 2 is same as C = C ^ 2
&= Bitwise AND assignment operator C &= 2 is same as C = C & 2
<<= Left shift AND assignment operator C <<= 2 is same as C = C << 2
>>= Right shift AND assignment operator C >>= 2 is same as C = C >> 2
----------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------
操作员描述示例
----------------------------------------------------------------------------------------
|=按位包含或,赋值运算符C |=2与C=C | 2相同
^=位异或和赋值运算符C^=2与C=C^2相同
&=按位AND赋值运算符C&=2与C=C&2相同
> 2
----------------------------------------------------------------------------------------
注意:所有运算符都是二进制运算符
另外注意:(以下几点我想补充我的答案)
是Java中的按位运算符,称为无符号移位>>
但是
不是Java中的运算符>>=
是按位补码位,~
(一元运算符),但0到1和1到0
不是运算符~=
- 另外,
代码>调用的不是逻辑运算符,而是
=代码>检查两个操作数的值是否相等,如果值不相等,则条件变为真。e、 g.
。其中as(A!=B)为真
表示如果A=!B
为B
则true
变为A
(如果false
为B
则false
变为A
)true
|
不称为管道,而称为或,管道是shell术语,用于将一个进程转移到下一个进程 注意:| |=不存在。(逻辑或)
你可以用
y= y || expr; // expr is NOT evaluated if y==true
或
我一直在寻找关于
|=
在Groovy中的作用的答案,尽管上面的答案是正确的,但它们并没有帮助我理解我正在查看的特定代码
特别是,当应用于布尔变量“|=”时,它将在第一次遇到右侧的truthy表达式时将其设置为TRUE,并将在所有|=后续调用中保持其TRUE值。像门闩一样
这里是一个简化的例子:
groovy> boolean result
groovy> //------------
groovy> println result //<-- False by default
groovy> println result |= false
groovy> println result |= true //<-- set to True and latched on to it
groovy> println result |= false
编辑:
这为什么有用
考虑这样一种情况:您想知道在各种对象上是否有任何更改,如果有,请通知其中一些更改。因此,您将设置一个hasChanges
布尔值,并将其设置为|=dif(a,b)
,然后设置为|=dif(b,c)
等。
下面是一个简单的例子:
groovy> boolean hasChanges, a, b, c, d
groovy> diff = {x,y -> x!=y}
groovy> hasChanges |= diff(a,b)
groovy> hasChanges |= diff(b,c)
groovy> hasChanges |= diff(true,false)
groovy> hasChanges |= diff(c,d)
groovy> hasChanges
Result: true
就像
j+=1代码>与j=j+1相同
@A.R.S.:我想不出Java中的反例(如果j
是volatile
?),但我相信你的话。@DavidSchwartz请看boolean hasVimble=DEFAULT\u Vimble&myFlags代码>-你能像Java那样将int
转换成boolean
吗?这在C中是有效的,但我认为在Java中它必须写成booleanHasVibrange=((DEFAULT\u-Vibrange&myFlags)==DEFAULT\u-Vibrange)
@DavidSchwartz哇,与+=
的比较最终让我明白了这一点。谢谢我想知道在这个问题上添加类似于pipeequal operator
的内容,或者在这个主题上添加任何其他文档,是否对人们的搜索没有帮助。@EJP你们是在谈论这个吗。它清楚地表明文档中缺少关于此用法的文档。除非您知道它被称为pipe equal,否则不询问任何人就很难搜索它。@ataulm确实花了一些时间在谷歌上搜索出一个术语垂直条
,最终将我带到了这里。可能是重复的我当时的印象是“pipe”是这个角色的名字,shell术语就是从这个名字来的。但是,看看维基百科,它实际上被称为“竖条”和“pipe”“特定于shell命令。我只是想说谢谢你加上那张便条!不太完整:您仍然可以将y |=expr
与布尔值一起使用,它在y
上给出与您的变体相同的结果,重要的是它不是短的curtuit,这意味着expr总是被计算的,即使在y==true
Yep的情况下,在Java中也是如此。但值得注意的是,这样的OR操作y |=expr
不是短路(不同于y=y | | expr
),这意味着总是对expr
进行计算。这对我来说第一次是不明显的:)所以在重构之前注意替换y|=expr
↔ y=y | | x
在语义上并不等同于caseexpr
实际上有副作用。考虑到这一点,在您使用hasChanges
的情况下,最好选择y=y | | x
形式来受益于短电路,因为当你发现任何变化时,实际上不需要做后续的差异,因为y
y = expr ? true : y; // expr is always evaluated.
groovy> boolean result
groovy> //------------
groovy> println result //<-- False by default
groovy> println result |= false
groovy> println result |= true //<-- set to True and latched on to it
groovy> println result |= false
false
false
true
true
groovy> boolean hasChanges, a, b, c, d
groovy> diff = {x,y -> x!=y}
groovy> hasChanges |= diff(a,b)
groovy> hasChanges |= diff(b,c)
groovy> hasChanges |= diff(true,false)
groovy> hasChanges |= diff(c,d)
groovy> hasChanges
Result: true