这个问题已经在这里有一个答案:
- 什么是“| =”是什么意思? (管道等于操作者) 6个答案
我只是要通过代码有人已经写好了,我看到|=
使用,Java的运营商仰视,它表明按位或并指定操作,任何人都可以解释,并给了我它的一个例子吗?
下面是读它的代码:
for (String search : textSearch.getValue())
matches |= field.contains(search);
这个问题已经在这里有一个答案:
我只是要通过代码有人已经写好了,我看到|=
使用,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
; 这意味着按位运算符具有相同的行为作为逻辑运算符。
在循环的每次迭代中,它OR
S的当前值matches
与任何从返回field.contains()
这有其设置为效果true
,如果它已经真实的, 或者如果field.contains()
返回true。
所以,它计算如果有任何调用的field.contains()
在整个循环,又回到true
。
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;
此代码:
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);
使比赛应该是true
,如果至少一个字段包含search
变量?
a |= b
是相同的a = a | b
a = a | b
a | b
a | b
是位运算符,如果两个操作数都是不可或缺的类型(int,短,等...)。 如果两个操作数都是布尔,那么它是一个布尔或。
当两个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
在另一方面, ||
实际上实现为字节/机器代码中的另一个条件跳转。 在某些情况下,它可能会更快使用评估布尔条件|
运营商为了避免额外跳跃(因此分支predition,等...)。 当然对于一些低级别的微基准测试来找出哪些是更好的(而且通常并不重要,在大多数应用中)。
当你做a |= b
你总是既评估a
和b
。 它并没有真正意义的有a ||= b
运营商,因为相当于a = a || b
a = a || b
将转化为:
if (a) a = true;
else if (b) a = true
else a = false;
......由于条件性质||
评价。 换句话说, b
也不会被评估,如果a
已经如此。
该代码段是什么时候使用运营商的坏榜样。 老实说,我不能想什么时候使用这个操作符,一个很好的例子,但这里是我最好的尝试:
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;
}
}
在一个侧面说明,在我看来,像原来的编码器可能已经打了一下 ,太多的代码高尔夫球时,他(她)写了这个:)