[英]Meaning of << and |= in Java
有一个用Java实现代码的问题,我必须查找字符串是否具有唯一字符,而不必创建新的数据结构。
Java实现如下:
public static boolean isUniqueChars(String str) {
int checker = 0;
for (int i = 0; i < str.length(); ++i) {
int val = str.charAt(i) - 'a';
if ((checker & (1 << val)) > 0) return false;
checker |= (1 << val);
}
return true;
}
在5-6行中,有<<我并没有真正得到。 在第6行中,我不知道'|'是什么 符号呢。
有人可以简要说明一下此代码的工作原理吗? 谢谢。
1.对于此符号: <<
在您的代码中: 1 << val
表示(int)Math.pow(2,val) = 2 ^ val
2.对于此符号: >>
>> is bit-shift operator
x >> N
表示(如果您将其视为一串二进制数字):
最右边的N
位被丢弃
最左边的位被复制多次,以将结果填充到原始大小(32或64位), 例如
00000000000000000000000000101011 >> 2 -> 00000000000000000000000000001010
11111111111111111111111111010100 >> 2 -> 11111111111111111111111111110101
3.对于此符号: |=
这意味着按位“或”或运算符
例如:
checker |= (1<<val)
is same as checker |= (2^val)
is same as checker = checker | (2^val) (*)
则: A | B ( | means Binary OR Operator copies a bit if it exists in either operand)
A | B ( | means Binary OR Operator copies a bit if it exists in either operand)
例
A = 00101010
B = 01101000
A | B = 01101010
与
0 OR 0 = 0 , 1 OR 0 = 1
1 OR 1 = 1 , 0 OR 1 = 1
使用Ziprox的有用提示,(1 << val)等效于2 ^ val或Math.pow(2,val)。 解密正在发生的事情变得容易得多。
我相信'int'是4个字节长,即32位。 此方法将字母(大写)中的每个字母转换为2 ^ val。 基本上,每个字母都由变量检查器的唯一位表示。 26个字母,32位为您提供6个额外的位,它们什么也不做。
checker & (1<<val)
只有在以前看到过这个数字的情况下,它才会是真实的。
checker |= (1<<val)
相当于
checker = (checker | (1<<val))
只是将字母的位从0翻转到1即可表明它已被看到。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.