Java的运营商:| =按位OR和分配例如[副本](Java Operators : |= bitw

2019-06-23 15:11发布

这个问题已经在这里有一个答案:

  • 什么是“| =”是什么意思? (管道等于操作者) 6个答案

我只是要通过代码有人已经写好了,我看到|=使用,Java的运营商仰视,它表明按位或并指定操作,任何人都可以解释,并给了我它的一个例子吗?

下面是读它的代码:

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

Answer 1:

a |= b;

是相同的

a = (a | b);

它计算的按位的两个操作数的OR,结果给左操作数分配

要解释你的示例代码:

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

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

在循环的每次迭代中,它OR S的当前值matches与任何从返回field.contains() 这有其设置为效果true ,如果它已经真实的, 或者如果field.contains()返回true。

所以,它计算如果有任何调用的field.contains()在整个循环,又回到true



Answer 2:

a |= b是相同的a = (a | b)

布尔变量

boolean上下文中,这意味着:

if (b) {
    a = true;
}

也就是说,如果b为真,那么a会是真实的,否则a将保持不变。

位运算

在逐位背景下,意味着,在设定每个二进制位b将成为集a 。 这是明显的位b将在未修改的a

所以,如果位0设置b ,它会也成为设置a ,每下面的例子:

  • 这将设置一个整数的底位:

    a |= 0x01

  • 这将清除底位:

    a &= ~0x01

  • 这将切换底位:

    a ^= 0x01;



Answer 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。



Answer 4:

难道是可能的代码中有一个错误,它的意思

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

使比赛应该是true ,如果至少一个字段包含search变量?



Answer 5:

a |= b是相同的a = a | b a = a | b

a | b a | b是位运算符,如果两个操作数都是不可或缺的类型(int,短,等...)。 如果两个操作数都是布尔,那么它是一个布尔或。

当两个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

在另一方面, || 实际上实现为字节/机器代码中的另一个条件跳转。 在某些情况下,它可能会更快使用评估布尔条件| 运营商为了避免额外跳跃(因此分支predition,等...)。 当然对于一些低级别的微基准测试来找出哪些是更好的(而且通常并不重要,在大多数应用中)。

当你做a |= b你总是既评估ab 。 它并没有真正意义的有a ||= b运营商,因为相当于a = a || b a = a || b将转化为:

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

......由于条件性质|| 评价。 换句话说, b也不会被评估,如果a已经如此。



Answer 6:

该代码段是什么时候使用运营商的坏榜样。 老实说,我不能想什么时候使用这个操作符,一个很好的例子,但这里是我最好的尝试:

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()用于第二如果。


如果你想知道为什么你不应该在第一个例子中使用的运营商,这是因为:

从性能的角度来看,因为它没有一个比较和每一个循环,而不是一个赋值只是它比较差。 此外,它继续迭代,即使未来的迭代将没有任何效果(一旦matches被设置为true也不会改变, String.contains没有副作用)。

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

因此,在地方片断我会去的:

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

在一个侧面说明,在我看来,像原来的编码器可能已经打了一下 ,太多的代码高尔夫球时,他(她)写了这个:)



文章来源: Java Operators : |= bitwise OR and assign example [duplicate]