gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 06:38:44 27 4
gpt4 key购买 nike

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

我遇到了下面的程序,但不理解下面程序中的 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com