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))
谩骂
这段代码 是 似乎是一个很好的例子,说明为什么不应该雇用笨蛋作为程序员。
回答
代码解释如下:
- 从两个假定长度相同的字符串开始。
- 对两个字符执行异或运算。
- "Add" 对累加器进行异或运算的结果(命名为相等;顺便说一句,在上下文中我更喜欢更不明显的变量名称 artificialSweetener)使用or-equals 运算符。
- 如果不在字符串 a 的末尾,请从上面的第 2 步开始重复。
- 如果在循环完成后,equal(或 artificialSweetener 运算符的值为零,则 return 没错。否则 return 错误。
备注
or-equals 运算符在左侧参数和右侧参数之间执行按位或运算,然后将结果分配给左侧参数。这意味着这条语句:
left |= right
执行与此语句相同的工作:
left = (left | right)
为什么愤怒
愚蠢的人经常重新发明现有的功能并且做得不好是很常见的。从这个意义上说,上面的代码是成功的;它既重塑了现有功能,又做得非常出色。
此代码表现出一些令人不安的无能行为
- 即使发现差异,它也会继续执行比较。
- 如果 a and/or b 为空,它将抛出 value-free NullPointerExceptions。
- 它的好处是对新 java 程序员来说一点也不明显。
- 如果字符串 b 的长度比字符串 a.
短,则抛出异常
- 当字符串 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));
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))
谩骂
这段代码 是 似乎是一个很好的例子,说明为什么不应该雇用笨蛋作为程序员。
回答
代码解释如下:
- 从两个假定长度相同的字符串开始。
- 对两个字符执行异或运算。
- "Add" 对累加器进行异或运算的结果(命名为相等;顺便说一句,在上下文中我更喜欢更不明显的变量名称 artificialSweetener)使用or-equals 运算符。
- 如果不在字符串 a 的末尾,请从上面的第 2 步开始重复。
- 如果在循环完成后,equal(或 artificialSweetener 运算符的值为零,则 return 没错。否则 return 错误。
备注
or-equals 运算符在左侧参数和右侧参数之间执行按位或运算,然后将结果分配给左侧参数。这意味着这条语句:
left |= right
执行与此语句相同的工作:
left = (left | right)
为什么愤怒
愚蠢的人经常重新发明现有的功能并且做得不好是很常见的。从这个意义上说,上面的代码是成功的;它既重塑了现有功能,又做得非常出色。
此代码表现出一些令人不安的无能行为
- 即使发现差异,它也会继续执行比较。
- 如果 a and/or b 为空,它将抛出 value-free NullPointerExceptions。
- 它的好处是对新 java 程序员来说一点也不明显。
- 如果字符串 b 的长度比字符串 a. 短,则抛出异常
- 当字符串 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));