具有移位和运算符的独特字符:不理解此代码

Pau*_*aul 3 java operators bit-shift

我不理解循环中的行:我们取字符并减去a,所以"10"?(为什么?)
然后1 << val:我们用val换1?(为什么?)
和检查器是0,那么我们如何达到> 0这个条件?

    public static boolean isUniqueChars(String str) {
    int checker = 0;
    for (int i = 0; i < str.length(); i++) {
        int val = str.charAt(i) - 'a';
        if ((checker & (1 << val)) > 0) return false;
        checker |= (1 << val);
    }
    return true;
}
Run Code Online (Sandbox Code Playgroud)

谢谢

cyc*_*130 7

代码假定str由小写字母组成,如果没有重复字母则返回true.它的工作原理如下:

checker用作位图,也就是说,此变量中的每个位用于跟踪一个字母.从字符中减去"a"给出'a'为0,为'b'为1,为'c'为2等.将此数字左移1为'a',2为'b',4为'c' '等

通过oring(|),该值与checker代码一起跟踪以前遇到的字符.所以,如果我们遇到第二个'a',例如,checker它是第一个位设置(&在if语句中测试),所以我们知道它str有重复.

简而言之,checker用作更快更紧凑的bool阵列.这种和类似的技术称为位操作.

  • `int`只有32位.因此它只能容纳32个不同字符的信息.通过减去'a',代码确保映射是a-> 0,b-> 1,...,z-> 25.通过向左移动1这个量你有这个映射(二进制):a-> 0001,b-> 0010,c-> 0100等.所以每个小写字母对应一个位.ORing设置了一下.ANDing清除所有其他位,因此可以检查是否设置了特定位.尝试在答案或谷歌"位操作"中链接的维基百科文章上的链接.C和C++具有相同的按位运算符,因此应该有大量的介绍性材料. (2认同)