Java运算符:| =按位OR并指定示例

我只是通过有人编写的代码,我看到了|=使用,查看Java运算符,它建议按位或分配操作,任何人都可以解释并给我一个例子吗?

这是读取它的代码:

  for (String search : textSearch.getValue()) matches |= field.contains(search); 

 a |= b; 

是相同的

 a = (a | b); 

它计算两个操作数的按位OR并将结果赋给左操作数。

要解释您的示例代码:

 for (String search : textSearch.getValue()) matches |= field.contains(search); 

我认为matches是一个boolean ; 这意味着按位运算符的行为与逻辑运算符相同。

在循环的每次迭代中,它是与field.contains()返回的matches的当前matches值。 如果它已经为真, 或者如果field.contains()返回true,则具有将其设置为true的效果。

因此,它计算在整个循环中对field.contains() 任何调用是否都返回true

a |= ba = (a | b)

布尔变量

boolean上下文中,它表示:

 if (b) { a = true; } 

也就是说,如果b为真,那么a将为真,否则a将不被修改。

按位操作

在有点明智的上下文中,它意味着在b设置的每个二进制位将在b设置。 b中清楚的位将在b被修改。

因此,如果在b设置位0,则根据以下示例,它也将设置为a

  • 这将设置整数的底部位:

    a |= 0x01

  • 这将清除底部位:

    a &= ~0x01

  • 这将切换底部位:

    a ^= 0x01;

这段代码:

 int i = 5; i |= 10; 

相当于这段代码:

 int i = 5; i = i | 10; 

同样,这段代码:

 boolean b = false; b |= true; 

相当于这一个:

 boolean b = false; b = b | true; 

在第一个例子中,正在执行逐位OR。 在第二个示例中,执行布尔OR。

代码是否有可能存在错误,这是有意义的

matches = matches || field.contains(search);

如果至少有一个字段包含search变量,那么匹配应为true

a |= ba = a | b相同 a = a | b

a | b 如果两个操作数都是整数类型(int,short等等),则a | b是一个按位运算符。 如果两个操作数都是布尔值,则它是布尔值或。

ab都是布尔值时, a | b之间的区别 a | ba || 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你总是在评估ab 。 有a ||= b运算符没有意义,因为等价的a = a || b a = a || b会转换为:

 if (a) a = true; else if (b) a = true else a = false; 

……由于||的条件性质 评价。 换句话说,如果a已经为真,则不会评估b

该代码段是何时使用该运算符的一个不好的示例。 老实说,我想不出何时使用此运算符的一个很好的例子,但这是我最好的尝试:

 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,否则你可以做somethingIsTrue | testSomethingElseTrue() somethingIsTrue | testSomethingElseTrue()用于第二个if。


如果你想知道为什么你不应该在第一个例子中使用运算符,这就是为什么:

从性能的角度来看,它很差,因为它为每个循环进行比较和分配,而不仅仅是比较。 此外,即使未来的迭代没有效果,它也会继续迭代(一旦matches设置为true它就不会改变,并且String.contains没有副作用)。

从可读性的角度来看,它也很差,完全基于这个问题的存在;)

因此,我代替那个代码片段:

 for (String search : textSearch.getValue()){ if(field.contains(search)){ matches = true; break; } } 

在旁注中,在我看来,原来的编码器可能在玩这个代码时打了太多代码 – 高尔夫时他写的这个:)