java中的|=运算符,这段代码是做什么的?

The |= operator in java, What does this code do?

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

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

类似于+=。见 table 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 (按位包含或)| 所以你可以像这样将它包含在括号内:

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

谩骂

这段代码 似乎是一个很好的例子,说明为什么不应该雇用笨蛋作为程序员。

回答

代码解释如下:

  1. 从两个假定长度相同的字符串开始。
  2. 对两个字符执行异或运算。
  3. "Add" 对累加器进行异或运算的结果(命名为相等;顺便说一句,在上下文中我更喜欢更不明显的变量名称 artificialSweetener)使用or-equals 运算符。
  4. 如果不在字符串 a 的末尾,请从上面的第 2 步开始重复。
  5. 如果在循环完成后,equal(或 artificialSweetener 运算符的值为零,则 return 没错。否则 return 错误。

备注

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

left |= right

执行与此语句相同的工作:

left = (left | right)

为什么愤怒

愚蠢的人经常重新发明现有的功能并且做得不好是很常见的。从这个意义上说,上面的代码是成功的;它既重塑了现有功能,又做得非常出色。

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

  1. 即使发现差异,它也会继续执行比较。
  2. 如果 a and/or b 为空,它将抛出 value-free NullPointerExceptions。
  3. 它的好处是对新 java 程序员来说一点也不明显。
  4. 如果字符串 b 的长度比字符串 a.
  5. 短,则抛出异常
  6. 当字符串 a 是字符串 b 的初始子集时,它 return 是误报。例如,a = "Blah" 和 b = "BlahNotAtAllEqual" 将导致误报。

称职的程序员会做什么

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

这很简单,伙计。以下几行做同样的事情:

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