我只是通过代码写了一些代码,我看到|=
用法,查看Java运算符,它建议按位或分配操作,任何人都可以解释并给我一个例子吗?
以下是阅读它的代码:
for (String search : textSearch.getValue())
matches |= field.contains(search);
答案 0 :(得分:28)
a |= b;
与
相同a = (a | b);
它计算两个操作数的按位OR ,将结果赋予左操作数。
解释您的示例代码:
for (String search : textSearch.getValue())
matches |= field.contains(search);
我认为matches
是boolean
;这意味着按位运算符的行为与逻辑运算符相同。
在循环的每次迭代中,OR
使用matches
返回的任何内容field.contains()
的当前值。如果true
已经为真,则会将其设置为field.contains()
,如果field.contains()
返回true,则为或。
因此,它计算在整个循环中,{strong>对true
的任何调用是否已返回{{1}}。
答案 1 :(得分:10)
a |= b
与a = (a | b)
布尔变量
在boolean
上下文中,它表示:
if (b) {
a = true;
}
即,如果b
为真,则a
为真,否则a
将不予修改。
按位操作
在有点明智的上下文中,它意味着b
中设置的每个二进制位都将在a
中设置。 b
中明确的位将在a
中不加修改。
因此,如果在b
中设置了位0,则根据以下示例,它也将在a
中设置:
这将设置整数的最低位:
a |= 0x01
这将清除底部位:
a &= ~0x01
这将切换底部位:
a ^= 0x01;
答案 2 :(得分:3)
此代码:
int i = 5;
i |= 10;
等同于此代码:
int i = 5;
i = i | 10;
同样,这段代码:
boolean b = false;
b |= true;
相当于这一个:
boolean b = false;
b = b | true;
在第一个示例中,正在执行逐位OR。在第二个示例中,执行布尔OR。
答案 3 :(得分:1)
代码是否有可能存在错误,这意味着
matches = matches || field.contains(search);
如果至少有一个字段包含true
变量,那么匹配应为search
答案 4 :(得分:1)
a |= b
与a = a | b
a | b
是一个按位运算符。 如果两个操作数都是布尔值,则它是布尔值或。
当a
和b
都是布尔值时,a | b
和a || b
之间的区别在于,在第一个方面,双方总是评估后,b
仅在a
为假时进行评估。它是一种“捷径”运算符。
这对于这样的情况很有用:
if (a == null || a.equals(b)) { .. do something .. } // works
if (a == null | a.equals(b)) { .. do something .. } // NPE if a is null
另一方面,||
实际上是作为字节码/机器码中的另一个条件跳转实现的。在某些情况下,使用|
运算符来评估布尔条件可能会更快,以避免额外的跳转(从而避免分支前缀等)。绝对是低级微基准测试的一部分,以确定哪个更好(在大多数应用程序中通常并不重要)。
当您执行a |= b
时,您始终会同时评估a
和b
。拥有a ||= b
运算符并不合理,因为等效a = a || b
会转换为:
if (a) a = true;
else if (b) a = true
else a = false;
...由于||
评估的条件性质。换句话说,如果b
已经为真,则不会评估a
。
答案 5 :(得分:0)
该代码段是何时使用该运算符的一个不好的示例。老实说,我想不出何时使用这个算子的一个很好的例子,但这是我最好的尝试:
boolean somethingIsTrue = testSomethingTrue();
if(somethingIsTrue){
//Do something
}
somethingIsTrue |= testSomethingElseTrue();
if(somethingIsTrue){
//Do something else
}
somethingIsTrue |= testSomethingElseTrue2();
if(somethingIsTrue){
//Do something else than something or something else
}
注意:你需要3个ifs,否则你只能为第二个if somethingIsTrue | testSomethingElseTrue()
做。{/ p>
如果你想知道为什么你不应该在第一个例子中使用运算符,这就是原因:
从性能的角度来看,它很差,因为它为每个循环进行比较和分配,而不仅仅是比较。此外,即使未来的迭代无效,它也会继续迭代(一旦matches
设置为true
,它就不会改变,String.contains
没有副作用)。
从可读性的角度来看,这也很差,完全基于这个问题的存在;)
因此,我代替那个片段:
for (String search : textSearch.getValue()){
if(field.contains(search)){
matches = true;
break;
}
}
另一方面,在我看来,当他写这篇文章的时候,原来的编码人员可能已经过多地玩位了{}}。