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 |= b
与a = (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 |= b
与a = a | b
相同 a = a | b
a | b
如果两个操作数都是整数类型(int,short等等),则a | b
是一个按位运算符。 如果两个操作数都是布尔值,则它是布尔值或。
当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
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; } }
在旁注中,在我看来,原来的编码器可能在玩这个代码时打了太多代码 – 高尔夫时他写的这个:)