这是检查输入字符串是否唯一的代码。第 1 行正在做什么? 11:check |=(1<<val)
为什么支票的二进制形式是这样的?
public boolean checkUnique(String str)
{
int check=0;
for(int i=0; i<str.length();i++)
{
int val = str.charAt(i)-'a';
if((check & (1 << val)) >0)
{
return false;
}
check |= (1<<val);
System.out.println("check "+Integer.toBinaryString(check));
}
return true;
}
I/P : "asdfgh"
O/P () :
0
check 1
18
check 1000000000000000001
3
check 1000000000000001001
5
check 1000000000000101001
6
check 1000000000001101001
7
check 1000000000011101001
最佳答案
这段代码看起来像是在检查字符串中的每个字符是否唯一。
int check=0;
初始化'check
' 与 0
;
int val = str.charAt(i)-'a';
ASCII 字符的最大值为 127,减去“a”即 97,给出 0 - 30 之间的值; [注意,这个函数似乎只能检查大于或等于 'a' (97) 的字符,否则,val 可能会被分配一个负值,这对于稍后的按位移位操作没有意义]。
对于第一次迭代,“if((check & (1 << val)) >0)
”将始终为 false,0 和任何 int 仍将是 0;
然后行“check |= (1 < < val);
”左移0x01,位数由“val”指定。例如,如果 val = 3,(1 << val) 将被评估为 0x08。 0 按位或 0x08 将使“检查”值为 0x08;
对于前面的迭代,每次都会生成一个新的“val”,并且“if”子句使用按位与来检查“val”是否已存在。如果存在,则返回 false 函数,否则,在“check”中“记录”新的“val”并继续下一次迭代。当循环结束时,返回true。
关于java - 按位运算检查字符串是否唯一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32173599/