定義:
假設有乙個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進行移位操作,總會在移到某個位的時候和這個數相等。這就是移位判斷的思想。因為二進...