在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行中,我不知道这个符号是干什么的。
有人能简单解释一下这段代码是如何工作的吗?谢谢。
发布于 2014-03-03 01:12:16
1.这个符号: <<
在您的代码中:1 << val表示(int)Math.pow(2,val) = 2 ^ val
2.这个符号: >>
>> is bit-shift operatorx >> N的意思是(如果您将它视为二进制数字的字符串):
最右边的N位被丢弃
将最左边的位复制一次,以便将结果复制到原来的大小(32或64位),例如()。
00000000000000000000000000101011 >> 2 -> 00000000000000000000000000001010
11111111111111111111111111010100 >> 2 -> 111111111111111111111111111101013.这个符号: |=
它意味着按位包含或赋值运算符。
,例如:
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发布于 2014-03-03 01:23:47
使用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,表示它已经被看到了。
https://stackoverflow.com/questions/22135980
复制相似问题