判斷乙個數是不是2的整數次冪

2021-10-10 03:05:47 字數 1145 閱讀 5528

位運算

二進位制數的位權是以2為底的冪,如果乙個整數 m 是 2 的 n 次冪,那麼轉換為二進位制之後只有最高位為 1,其餘位置為 0,再觀察 m-1 轉換為二進位制後的形式以及 m&(m-1) 的結果,例如:

2 --> 0000 0010 1 --> 0000 0001 2&1 --> 0000 0010 & 0000 0001 = 0

4 --> 0000 0100 3 --> 0000 0011 4&3 --> 0000 0100 & 0000 0011 = 0

8 --> 0000 1000 7 --> 0000 0111 8&7 --> 0000 1000 & 0000 0111 = 0

可以看出所有的 1 完美的錯過了,根據位與的特點可知m&(m-1) 的結果為 0

如果整數 m 不是 2 的 n 次冪,結果會怎樣呢?例如 m=9 時:

9 --> 0000 1001 8 --> 0000 1000 9&8 --> 0000 1001 & 0000 1000 != 0

利用這一特點,即可判斷乙個整數是否是2的整數次冪。

此要求為:一副影象如果不是2的整數次冪,需要進行填充。

def

padding

(f):

m = f.shape[0]

n = f.shape[1]

# 先判斷是否需要填充

if(m&

(m-1))

or(n&

(n-1))

:# 填充為2的整數次冪

m_new = math.

pow(

2,math.ceil(math.log2(m)))

n_new = math.

pow(

2,math.ceil(math.log2(n)))

p = np.zeros(

(int

(m_new)

,int

(n_new)))

# 填充的0在**都可以

p[0:m,

0:n]

= f return p

return f

判斷乙個數是不是2的冪

將2的冪次方寫成二進位制形式後,很容易就會發現有乙個特點 二進位制中只有乙個1,並且1後面跟了n個0 因此問題可以轉化為判斷1後面是否跟了n個0就可以了。如果將這個數減去1後會發現,僅有的那個1會變為0,而原來的那n個0會變為1 因此將原來的數與去減去1後的數字進行與運算後會發現為零。最快速的方法 ...

判斷乙個數是不是2的冪

我們經常會遇到這樣乙個問題,就是判斷某個資料是否為2的n 次方 1,2,4,8,16.例如如果使用者輸入的不是 2 n,則要求使用者重新輸入。為了說明這種判斷演算法,我首先構造乙個測試程式,如下 include include int main end clock printf the total ...

判斷乙個數是不是2的整數次冪 兩種方法

方法一 用這個數來除以2,得到商和餘數,如果餘數不為0,那這個數就不是2的整數次冪,否則再用商除以2,又得到商和餘數,重複上面的操作,直到商為1,當商為1,餘數為0時,這個數就是2的整數次冪當商為0。author lzyws739307453 language c include using nam...