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

时间:2012-04-13 13:47:48

标签: java operators bit-manipulation variable-assignment

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

以下是阅读它的代码:

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

6 个答案:

答案 0 :(得分:28)

a |= b;

相同
a = (a | b);

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

解释您的示例代码:

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

我认为matchesboolean;这意味着按位运算符的行为与逻辑运算符相同。

在循环的每次迭代中,OR使用matches返回的任何内容field.contains()的当前值。如果true已经为真,则会将其设置为field.contains(),如果field.contains()返回true,则为

因此,它计算在整个循环中,{strong>对true的任何调用是否已返回{{1}}。

答案 1 :(得分:10)

a |= ba = (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 |= ba = a | b

相同 如果两个操作数都是整数类型(int,short等等),则

a | b是一个按位运算符。 如果两个操作数都是布尔值,则它是布尔值或。

ab都是布尔值时,a | ba || 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会转换为:

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;
    }
}

另一方面,在我看来,当他写这篇文章的时候,原来的编码人员可能已经过多地玩了{}}。