<<的含义和| =在Java中

时间:2014-03-03 01:06:10

标签: java string operators unique

在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行,我没有得到什么'|'符号呢。

有人可以简要解释一下这段代码的工作原理吗? 感谢。

2 个答案:

答案 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,表示已经看到它。