1.number%2==0
取余(取模)只能判斷number是不是2的倍數但不一定是2的N次方,如:6%2==0但是他并不是2的N次方
2.(number&(number-1))==0
原理:如果number是2的N次方則表示2進制位只有一位是1。如:2 (10) 4(100) 8(1000) 16(10000) 那么number-1就會得到一個低位全部是1的2進制數 1(01) 3(011)
拿8做例子
8? 1000
7? 0111
&? 0000
結果就是0? ?
當一個整數是2的N次方時,它的二進制表示只有一位是1,其余位都是0。例如,2的3次方是8,其二進制表示為
00001000
;2的4次方是16,其二進制表示為00010000
。如果我們將一個2的N次方的整數減去1,會得到一個所有低位都是1的數。例如,對于2的3次方的整數8,減去1得到7,其二進制表示為
00000111
;對于2的4次方的整數16,減去1得到15,其二進制表示為00001111
。當我們對這兩個數進行按位與操作
(number & (number - 1))
,如果結果等于0,則表示只有一位是1,也就是指定的整數是2的N次方。舉個例子,假設我們要判斷整數12是否是2的N次方。其二進制表示為
00001100
。我們可以進行計算:12 : 00001100 12 - 1 : 00001011 AND 操作 : 00001000
結果是
00001000
,不等于0,說明12不是2的N次方。?
public static bool IsPowerOfTwo(int number)
{// 判斷是否為負數或零if (number <= 0)return false;// 使用位運算判斷是否只有一位是1return (number & (number - 1)) == 0;
}
private static boolean isPowerOfTwo(int n) {return (n > 0) && ((n & (n - 1)) == 0);
}
如果計算這個數是2的N次方得出返回N這個值
public static int getExpontOfTwo(int number){if(number <=0 || (number & (number -1)) != 0){return -1;}int expont = 0;while(number != 1){number >>= 1;expont++;}return expont;}}