java - Bitshift - 需要帮助来理解代码

标签 java bitwise-operators bit-shift

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

我遇到了下面的程序,但不理解下面程序中的 AND 条件部分(检查器 & (1 << val)。最终值何时会大于 0?有人可以解释一下那里发生了什么吗?

示例输入: 好吧

示例输出:

8388608值 0检查器 0最终值

16777216值 8388608检查员 0最终值

33554432值 25165824检查员 0最终值

33554432值 58720256检查员 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;
    }

}

最佳答案

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

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

假设是英文字母表,这是用你的(小写)字母的 char 值减去 97('a' 的 char 值)得到一个介于 0 和 25 之间的数字(含 0 到 25)。不要在大写字符上尝试这个函数,除非你添加 .toLowerCase() 否则你会得到错误。在.charAt(i)之后

1 << val正在位移 1 val左边的地方。例如,对于“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 .

关于java - Bitshift - 需要帮助来理解代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15909949/

相关文章:

c++ - AVX2的 vector 移位的AVX替代方案?

java - 为什么集合的输出与列表相同。我认为这会有所不同,因为集合是无序的

java - 发生 MaxUploadSizeExceededException 时如何关闭套接字?

python - 按位运算 : C vs. Python

ios - Swift 中的校验和和 XOR

python - 根据 python 中的给定条件最小化 n 的最快方法

c - 转移 __m128i 的最佳方法?

java - 有人可以帮我修复这个代码吗,我是java新手

java - 基于 Maven 配置文件的 context.xml 中的 JNDI 配置

java - java中的运算符>>和运算符>>>有什么区别?