java中的| =运算符,这段代码有什么作用?

时间:2015-12-31 12:53:08

标签: java bit-manipulation

int equal = 0;
for (int i = 0; i < a.length(); i++) {
   equal |= a.charAt(i) ^ b.charAt(i);
}
return equal == 0;

我理解管道和XOR运算符但是|=在做什么?

3 个答案:

答案 0 :(得分:5)

类似于+ =。见表here

|=        bitwise inclusive OR and assignment operator   C |= 2 is same as C = C | 2

所以它等同于将代码编写为:

equal = equal | a.charAt(i) ^ b.charAt(i)

同样正如luk2302指出的那样,那里(按位异或)^ has higher precedence over(按位包含OR)|所以你可以把它包含在括号内,如下所示: / p>

equal = equal | (a.charAt(i) ^ b.charAt(i))

答案 1 :(得分:1)

诽谤

此代码 似乎是一个很好的例子,说明为什么不应该聘请goofballs作为程序员。

答案

以下是对代码的解释:

  1. 从两个字符串开始,假设它们的长度相同。
  2. 对两个字符执行xor操作。
  3. &#34;添加&#34; xor操作对累加器的结果(命名相等;另外,在上下文中我更喜欢使用or-equals运算符的更不明显的变量名 artificialSweetener )。
  4. 如果不在字符串 a 的末尾,请从上面的步骤2开始重复。
  5. 如果在循环完成后,等于(或 artificialSweetener ,如您所愿)运算符的值为零,则返回true。否则返回false。
  6. 备注

    or-equals运算符在左手参数和右手参数之间执行按位或运算,然后将结果赋给左手参数。这意味着这句话:

    left |= right
    

    执行与此声明相同的工作:

    left = (left | right)
    

    为什么愤怒

    goofballs经常重新发明现有的功能并且做得很差。从这个意义上讲,上面的代码是成功的;它既重新发明了现有的功能又做得非常糟糕。

    此代码表现出一些令人不安的无能行为

    1. 即使找到差异,它仍继续进行比较。
    2. 如果 a 和/或 b 为空,它将抛出无值的NullPointerExceptions。
    3. 对于较新的java程序员来说,它的好处并不明显。
    4. 如果字符串 b 的长度短于字符串 a ,则会引发异常。
    5. 当字符串 a 是字符串 b 的初始子集时,它返回误报。例如,a =&#34; Blah&#34;和b =&#34; BlahNotAtAllEqual&#34;会导致误报。
    6. 有能力的程序员做什么

      不是白痴的程序员会使用 String.equals 方法执行字符串比较操作,或者,如果他们不仅仅是勉强称职,他们会使用像Apache Commons Lang这样的实用程序StringUtils执行空安全比较。

答案 2 :(得分:0)

这是一个简单的伴侣。以下几行做同样的事情:

equal |= a.charAt(i) ^ b.charAt(i);
equal = equal | (a.charAt(i) ^ b.charAt(i));