Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么是|=&引用;什么意思?(管道相等运算符)_Java_Android_Operators - Fatal编程技术网

Java 什么是|=&引用;什么意思?(管道相等运算符)

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

我尝试使用谷歌搜索和StackOverflow进行搜索,但没有显示任何结果。我在开源库代码中看到了这一点:

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.
    (A!=B)为真
    。其中as
    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
在语义上并不等同于case
expr
实际上有副作用。考虑到这一点,在您使用
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