繁体   English   中英

Java中<<和| =的含义

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM