對於判斷乙個數是否為2的n次方問題,通常想到的最為直接的辦法就是對這個數不斷對2取餘,為0就將該數變為該數除以2,直到最後該數為1為止。
void judge(int n)
} printf("no!\n");
return;
}
不過上面的方法並不是較好的方法,其實還有更為簡潔高效的方法
乙個整數,若是2的n次方,有沒有想過對這個整數的2進製進行考慮,比如12,它的二進位制為:1100
2 10
4 100
13 1101
16 10000
32 100000
從上面的舉例我們發現,凡是2的n次方的整數,其二進位製碼只有乙個1。
假設a為要證明的整數,b等於a-1,我們假設a為2的n次方數,那麼a&b = 0,這很好證明。那是不是滿足a&b = 0就能證明a是2的n次方數呢?
假設乙個數的二進位制為1000000000000000(這裡為int型:兩個位元組),那這個數減去1則變為0111111111111111。我們知道,在計算機中,數都是以其二進位制的補碼放置的,最高位為1代表負數,最高位為0代表正數。上面兩個數中,
1000000000000000為負數,0111111111111111為正數,這兩個數相與為0,但1000000000000000並不是2的n次方(2的n次方為正數)。
因此,倘若乙個數為2的n次方,那麼該數應滿足大於0且該數和該數減一后的值相與等於0時才為2的n次方。
void judge(int n)
printf("no!\n");
return;
}
如何判斷乙個數是否是2的n次方
2的n次方可以表示為 2 0,2 1,2 2,2 3,2 4.2 n。最直觀的思想是用1做移位操作,然後判斷移位後的值是否與給定的數相等,具體的實現 如下 public class movebyte return false public static void main string args 以...
輸入乙個數判斷是否是2的N次方
當時去理解這段 num num 1 0時 將 按權與當成是 邏輯與進行運算 注意 取位址運算子和按權與得符號都是 取位址時直接符號後面加變數 如 a,b。按權與時後面需要跟乙個數,如a 1。按權與得優先順序小於 得優先順序,不要搞混!花了好長時間也沒搞懂到底是怎麼樣的運算邏輯,後來網上查了一下才知道...
如何判斷乙個數n是否是2的k次方?
問題描述 如何判斷乙個數 n 是否是 2 的 k 次方?注意 不用求 k 是多少,只需要判斷,請編寫函式實現。首先研究一下 2 的 k 次方的資料的特徵 0001 b 2 0 1,0010 b 2 1 2,0100 b 2 2 4。以此得出 2 k 的資料在二進位制表示中只有一位為 1 其實這道題與...