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)
好的,只是为了确保你知道发生了什么:
int val = str.charAt(i) - 'a';
假设使用英文字母,这将获取(小写)字母的char值并减去97('a'的char值)以产生0到25之间的数字.不要在大写字符上尝试此功能,除非你在.toLowerCase()后面添加一个,否则你会收到错误.charAt(i)
1 << val是val左移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.
| 归档时间: |
|
| 查看次数: |
127 次 |
| 最近记录: |