java新手 - 了解实际使用中的位操作

时间:2014-09-17 11:42:28

标签: java android

//determines if string contains unique characters

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)   <--- right here
            return false;
        checker |= (1 << val);
    }
    return true;
}

我所理解的是&lt;&lt;向二进制数添加额外的零,从而增加值。例如:2 <&lt; 3 = 10 + 000 = 10000 //二进制为16。所以我的问题是,这有什么用?这对我们如何帮助我们找到独特的角色

2 个答案:

答案 0 :(得分:4)

算法有效,因为检查器变成了一个位图,告诉我们遇到了哪些字符。

我想我会用一个例子来解释。让我们说我们的字符串是&#39; bedb&#39;。 我们从checker = 0开始。 那么&#39; b&#39;谈到。 val == 1因为'b' - 'a' == 1

如上所述,

(1&lt;&lt; val)以二进制表示为10。

checker | 10 = 00 | 10 = 10

这意味着我们遇到了一个b(右起第二位有一个)并且没有遇到a。 然后e来了。 val == 4。二进制文件中(1 << val)10000

checker | 10000 = 10 | 10000 = 10010

好。现在我们知道我们遇到了eb

d之后,检查程序为11010

然后b来了。 (1 << val)10。此处(checker & (1 << val))不再为零。

11010 & 1010。 所以该方法返回false,因为它找到了之前遇到的字符。

答案 1 :(得分:1)

1)每个符号在单词中的位置为1,例如:a = 1,b = 10,c = 100,d = 1000 2)检查器保存之前呈现的每个符号的比特位置(检查器| =(1 <&lt;&lt; val) 3)如果符号已经保存,则相同位置的位为1,结果为:方程检查器&amp; (1&lt;&lt;&lt; val)将大于零(PROFIT),如果位置为0(当时没有相同的符号)则为零