1. 程式人生 > >如何判斷一個數是否為2的冪次方

如何判斷一個數是否為2的冪次方

最近在OJ上做題,遇到一道題,其中一個細節就是需要判斷一個數是否為2的冪次方。初看似乎很簡單,可我想來想去,竟然無甚好辦法。最後我用一個笨辦法解決了,那就是將2 4 8 16 32… …存到一個數組裡,遍歷一遍陣列就知道了。但是這個辦法著實不優美。

下面介紹一個好辦法

 


  • (n & n - 1) == 0 

 

將2的冪次方寫成二進位制形式後,很容易就會發現有一個特點:二進位制中只有一個1,並且1後面跟了n個0。如果將這個數減去1後會發現,僅有的那個1會變為0,而原來的那n個0會變為1;因此將原來的數與減去1後的數字進行與運算

後會發現為零。

  • & 按位與運算子:兩位同時為1,結果才為1,否則為0
  • | 按位或運算子:兩位中有一個為1,結果就為1
  • ^ 異或運算子:兩位值不同,結果為1,否則為0
  • ~ 取反運算子:將0變1,1變0,就是反著來
  • << 左移運算子:各二進位制位全部左移若干位,左邊丟棄,右邊補0
  • >> 右移運算子:各二進位制位全部右移若干位,正數左補0,負數左補1,右邊丟棄
  • 兩個不同長度的資料進行位運算時,系統會將二者按右端對齊,然後進行位運算。短的那個資料如果是負數,左邊補1,否則補0