Bitshift - 需要帮助来理解代码

Lea*_*ner 1 java bit-shift bitwise-operators

我只是想学习按位/移位操作.

我遇到了以下程序,但是不了解以下程序中的AND条件部分(检查器和(1 << val).最终值何时大于0?有人可以解释那里发生的事情吗?

示例输入:xyzz

样本输出:

8388608Value 0checker 0final value

16777216Value 8388608checker 0final value

33554432Value 25165824checker 0final value

33554432Value 58720256checker 33554432最终价值

public static boolean isUniqueChars(String str) {
        int checker = 0;
        for (int i = 0; i < str.length(); i++) {
            int val = str.charAt(i) - 'a';

            System.out.println((1 << val) + "Value");
            System.out.println((checker) + "checker");
            System.out.println(((checker & (1 << val))) + "final value\n");

            if ((checker & (1 << val)) > 0) {
                return false;
            } else {
                checker = checker | (1 << val);
            }
        }
        return true;
    }

}
Run Code Online (Sandbox Code Playgroud)

Pow*_*ord 6

好的,只是为了确保你知道发生了什么:

int val = str.charAt(i) - 'a';

假设使用英文字母,这将获取(小写)字母的char值并减去97('a'的char值)以产生0到25之间的数字.不要在大写字符上尝试此功能,除非你在.toLowerCase()后面添加一个,否则你会收到错误.charAt(i)

1 << valval左移1 位.例如,对于'x'(120 - 97 = 23,所以...... 1 << 23),二进制表示将是00000000010000000000000000000000

好的,到目前为止我?

一开始,检查器全部为0位,所以就是这样 00000000000000000000000000000000

所以...让我们输入数字而不是变量.对于我们的x检查,checker & (1 << val)变为00000000000000000000000000000000 & 00000000010000000000000000000000等于00000000000000000000000000000000因为第23位没有设置在检查器中.

因此,一旦x处理完毕,我们将第23位添加到检查器并继续下一个字母:y 此时,checker & (1 << val)变为00000000010000000000000000000000 & 00000000100000000000000000000000等于00000000000000000000000000000000因为第24位未设置在检查器中.

对于第一个z,checker & (1 << val)变为00000000110000000000000000000000 & 00000001000000000000000000000000等于00000000000000000000000000000000因为第25位没有设置在检查器中.

对于第二个z,checker & (1 << val)变成00000001110000000000000000000000 & 00000001000000000000000000000000其等于00000001000000000000000000000000(十进制33554432或2 ^ 25),因为位25 在检验器设定,因此,> 0现在是true和函数返回false.