2014-02-25 18 views
-4

功率:的Java:如果發現號找到了解決方案的2

private static boolean isPowerOfTwo(int number) { 
     if(number <=0){ 
      throw new IllegalArgumentException(number + " is too small."); 
     } 
     if ((number & -number) == number) { 
      return true; 
     } 
     return false; 
    } 

但不明白的if語句之一。 if ((number & -number) == number)這裏是什麼意思?

+3

中查找'&'運營商。 –

+0

可能的重複[查找如果一個數是兩個冪沒有數學函數或日誌功能](http://stackoverflow.com/questions/19383248/find-if-a-number-is-a-power-of-兩無,數學函數或對數函數) – Cole9350

回答

1

&是一個按位AND運算符。你需要知道一些二進制數來知道這個函數是如何工作的。

負數用two's complement表示法表示,其中最左邊的位用於指示數字是正數(如果是0)還是負數(如果是1)。

如果數字由二進制數字序列表示,則其值爲2,除了一個數字外,其值均爲0。例如,2^6 = 64由0100 0000

計算相應的負數表示通過施加一個按位NOT運算符(即,改變所有0至1和所有1到0),然後加入1到結果 - 在我們的例子:

0100 0000 becomes 1011 1111 + 1 = 1100 0000 

如果排隊2支二進制數:

0100 0000 
1100 0000 

和應用按位與,得到的數字是原來的號碼64:

0100 0000 

這就解釋了爲什麼number & -number == number用來確定一個數是否是2 的功率要證明,讓我們嘗試用幾個其他的數字不是2功率:

0100 0001 (65) 
1011 1111 (-65) 
--------- 
0000 0001 (1) 

0000 0011 (3) 
1111 1101 (-3) 
--------- 
0000 0001 (1)