2014-03-03 76 views
1

有一個在Java中實現代碼的問題,我必須在不必創建新數據結構的情況下查找字符串是否具有唯一字符。<<和| = in Java的含義

Java實現如下:

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; 
} 

在5-6行,還有的< <,我真的不明白。 而在第6行,我不明白'|'符號呢。

有人可以簡單介紹一下這段代碼的工作原理嗎? 謝謝。

+8

位智能和位移操作符:http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html – aliteralmind

+0

您是否考慮過查閱[documentation](http://docs.oracle。 COM/JavaSE的/規格/ JLS/SE7/HTML/index.html的)? – EJP

回答

4

1.對於這個符號:<<

在您的代碼:1 << val裝置(int)Math.pow(2,val) = 2^val



2.對於這個符號:>>

>> is bit-shift operator 

x >> N裝置(如果查看它作爲二進制數字串):

最右邊N位被丟棄

最左邊的比特被複製爲在必要時墊多次的結果爲原始大小(32或64位), 例如

00000000000000000000000000101011 >> 2 -> 00000000000000000000000000001010 

11111111111111111111111111010100 >> 2 -> 11111111111111111111111111110101 


3.對於這個符號:|=

這意味着按位或和賦值操作符

E.g:

  checker |= (1<<val) 
is same as checker |= (2^val) 
is same as checker = checker | (2^val) (*) 

然後:A | B ( | means Binary OR Operator copies a bit if it exists in either operand)

A  = 00101010 
    B  = 01101000 
A | B = 01101010 

0 OR 0 = 0 , 1 OR 0 = 1 
    1 OR 1 = 1 , 0 OR 1 = 1 
+0

他不問''',他問'''。關於符號擴展的東西是無關緊要和混亂的。 –

2

使用Ziprox的有用的提示(1 < < VAL)等效於2^VAL或Math.pow (2,VAL)。破譯發生的事情變得容易得多。

我相信'int'是4個字節長,這是32位。此方法將字母表(undercase)中的每個字母轉換爲數字2^val。基本上,每個字母都由變量檢查器的唯一位表示。26個字母,32位給你6個額外的位,什麼都不做。

checker & (1<<val) 

只會是以前看過的數字纔對。

checker |= (1<<val) 

相當於

checker = (checker | (1<<val)) 

它只是翻轉的那封信的位從0到1,表明它已經看到。