2012-07-17 35 views
3

我有麻烦理解此代码检测字符串中的重复项。使用移位运算符在字符串中检测重复项java

int checker = 0; 
    for(char ch : seed.toCharArray()){ 
     int val = ch - 'a'; 
     System.out.println(val); 
     if ((checker & (1 << val)) > 0){ 
      // duplicate found 
      break; 
     } 
     checker |= (1 << val); 
    } 

有人可以解释我一个例子,这是如何工作的?

+1

它为找到的每个字母(a是第一位,b第二等等)设置位,然后检查该位是否已经设置过。这些位保存在一个整数中(它可以存储32个,对于字母表来说足够了,但是如果你有非字母或大写字母则不能)。 – Thilo 2012-07-17 07:49:56

+0

你应该发布,作为回答,而不是评论:) – 2012-07-17 07:50:19

+0

@Thilo好吧,如果我有一个位置在Java中的IF('当前字符'位集)为零,我们将其设置为1,并在ELSE上移动,如果它已经是1突围的循环会有类似的方法吗?并将只使用26位。 (考虑我只处理'a'到'z') – Vivek 2012-07-17 07:57:16

回答

3

好,比方说ch = 'c'

int val = 'c' - 'a' = 2; //The char value for 'c' is two greater that that for 'a' 

然后评估if条件:

1 << 2 

平均的“1两个地左移”,这使我们的二进制100,或十进制4.

checker & 4 

的意思是“按位和”检查,即检查之间,如果该特定位已经设置。

如果该位被设置,我们完成,否则,我们执行

c |= 4 

这意味着“C = C | 4”,这是一个按位或将设置对应于“c中的位'设置为1.

0

它似乎使用checker作为位图:位0为'a',位1为'b'等。它检查信件是否已经设置为(checker & (1 << val)) > 0,如果不是,则它设置它checker |= (1 << val)