我只是想学习按位/移位操作。
我遇到了下面的程序,但不理解下面程序中的 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/