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;
// 使用位运算判断是否只有一位是1
return (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;
}
}