不用迴圈,如何判斷乙個數是2的冪

2021-06-18 00:27:55 字數 1868 閱讀 3603

定義:

假設有乙個32位無符號非0整數x,它的二進位制應該是這個樣子的:

b(31) b(30) b(29)...b(0)

假設最高位的1所在的位置為m,最低位的1所在的位置為n,m>= n

x非0,所以n>= 0 && n <= 31我們可以將這個2進製分成三段

seg1: b(31) - b(m+1)     該段為全0, 長度為31 - (m+1) + 1 = 31 - m,如果m == 31,顯然該段就沒有

seg2: b(m) - b(n+1)    該段最高位為1,剩餘位任意, 長度為m - n,如果m == n ,顯然該段就沒有

seg3: b(n) - b(0)   該最高位為1,其餘位為0,  長度為 = n+1

現在回到我們的命題,2的冪有怎樣的特徵

乙個整數乘以2,從位的角度來說就是左移一位,那麼2的k次方也就是k個2相乘,左移k-1位:

2e0 = bit(1)

2e1 = bit(1 << 1) = bit(10) = 2

2e2 = bit(1 << 2) = bit(100) = 4

2ex = bit(1 << x) = bit(1 x個0) 

所以從二進位制的角度來看,2的冪一定是乙個有且僅有乙個1的數

現在回到我們的命題,先給出答案:

a為2的冪,當且僅當(a & (a-1)) == 0

證明:

a表達為bit(seg1 seg2 seg3),那麼a為2的冪,當且僅當a是乙個有且僅有乙個1的二進位制數

由於seg3有乙個1,seg2長度不為0(m > n)時seg2一定有至少乙個二進位制1,所以要求seg2長度為0,即m==n(也就是seg1全0,seg2長度為0, seg3僅最高位為1)

這樣可以得出:

a為2的冪等價於m==n

所以轉換目標命題為:

m==n,當且僅當(a & (a-1)) == 0,或者說m==n等價於(a & (a-1)) == 0

a -1的二進位制為bit(seg1 seg2 seg3) - 1

由於seg3為bit(1000...000),所以:

a-1 = bit(seg1 seg2 seg4) 

其中seg4 = bit(0 1111...111), 位數為n+1,最高位為0,其餘為1

a & (a-1) 

= bit(seg1 seg2 seg3) & bit(seg1 seg2 seg4) 

= bit((seg1 & seg1)  (seg2 & seg2)  (seg3 & seg4))

因為x & x = x,所以:

a & (a-1) = bit(seg1 seg2 seg3&seg4)

顯然seg3 & seg4 = 0,所以:

a & (a-1) = bit(seg1 seg2 seg5)

其中: seg5為n+1個0

現在證明:m==n  => (a & (a-1)) == 0

m == n 所以seg2長度為0,也就不存在,而seg1和seg5全0,所以a & (a-1)全0,即證

再證明: (a & (a-1)) == 0 => m==n

(a & (a-1)) == 0,所以seg1/seg2/seg5全0,對seg2來說,如果存在那麼最高位一定為1,此時m > n,顯然與全0衝突,故seg2不存在,也就是說m<= n

而從定義中可知m>=n,所以m == n,即證

由上可知:

m==n  等價於(a & (a-1)) == 0

證畢

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

private static boolean ispoweroftwo int val 或者private static boolean ispoweroftwo int val 例如 val 8,用二進位制表示 1000 val 1 7,用二進位制表示 0111 val val 1 0 原理 在二...

如何判斷乙個數是否為2的冪

給定乙個整數,寫乙個函式判斷該函式是否為2的冪。例如輸入 16 輸出 true 輸入 5 輸出 false bool ispoweroftwo int n bool ispoweroftwo int n 由二進位制原理可以知道,如果乙個數為2的冪,那麼這個數對應的二進位制應該只有乙個1,演算法1 在...

如何證明乙個數是2的冪次方

乙個數是否是2的冪次方,比較常用的是遞迴和移位運算進行判斷。遞迴演算法的思想很簡單,就是不斷的模上2去判斷。如果乙個數是2的冪,那麼它的二進位制表示中就只有一位1,例如 10000,1000,100等等。所以如果對數字1進行移位操作,總會在移到某個位的時候和這個數相等。這就是移位判斷的思想。因為二進...