在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行中,有&lt;&lt;我真的没有。 在第6行,我没有得到什么'|'符号呢。
有人可以简要解释一下这段代码的工作原理吗? 感谢。
答案 0 :(得分:4)
<强> 1。对于此符号: <<
在您的代码中:1 << val
表示(int)Math.pow(2,val) = 2 ^ val
<强> 2。对于此符号: >>
>> is bit-shift operator
x >> N
表示(如果您将其视为二进制数字字符串):
最右边的N
位被丢弃
根据需要复制最左边的位以将结果填充到原始大小(32或64位), 的 e.g。强>
00000000000000000000000000101011 >> 2 -> 00000000000000000000000000001010
11111111111111111111111111010100 >> 2 -> 11111111111111111111111111110101
第3。对于此符号: |=
它表示按位包含OR和赋值运算符
<强> E.g:强>
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 = 00101010
B = 01101000
A | B = 01101010
与
0 OR 0 = 0 , 1 OR 0 = 1
1 OR 1 = 1 , 0 OR 1 = 1
答案 1 :(得分:2)
使用Ziprox的有用提示(1 <&lt;&lt;&lt; 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,表示已经看到它。