请解释说明给定单词是否唯一的代码段?

时间:2017-07-09 14:28:31

标签: java

有人可以解释一下这个代码片段的工作原理,该代码片段说明给定的单词是否唯一?

public static boolean isUniqueChars(String str) {
    if (str.length() > 128) {
        return false;
    }
    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;
}

我不明白以下两行中发生了什么:

if ((checker & (1 << val)) > 0) return false;
checker |= (1 << val);

谢谢!

2 个答案:

答案 0 :(得分:0)

Checker的行为类似于布尔数组。此数组的每个元素都存储是否使用字符。 因此,checker|= (1 << Val)将一个字符存储到array.and if语句中,检查是否使用了此字符。

但似乎很奇怪:< 128比较。因为int的长度是32位。

答案 1 :(得分:0)

要了解它在bit level中的工作方式,请输入Integer.toBinaryString()并检查。基本上,无论何时在任何积分值中使用位运算符,实际操作都会发生在相应的二进制值上。

public static boolean isUniqueChars(String str) {
        if (str.length() > 128) {
            return false;
        }       int checker = 0;
        for (int i = 0; i < str.length(); i++) {
            int val = str.charAt(i) - 'a';
            System.out.println("Actual Value " + val); // ASCII substraction
            System.out.println("Actual Value in Binary " + Integer.toBinaryString(val));
            System.out.println("Left Shift Value in Binary " + Integer.toBinaryString(1<<val));
            System.out.println("Operator Value is" + Integer.toBinaryString(checker & (1 << val))));
            if ((checker & (1 << val)) > 0) 
                return false;
            checker |= (1 << val); // checker = checker | (1<<val)
            System.out.println("Checker Value in Binary " + Integer.toBinaryString(checker));
        }
        return true;
    }

运行此命令并检查那些print语句,然后您可以识别位操作符的工作方式。

逻辑值: 每次左移一个ASCII减去的值,然后用前一个检查值完成BIT(或)。如果当前和检查值BIT(或)返回&gt; 0表示该值的某个位位置为1.因此它是重复的char。我知道这听起来并不复杂,但要花时间调试它。

希望它可以帮到你。