2012-07-17 40 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)