预备知识:
&是二进制“与”运算,参加运算的两个数的二进制按位进行运算,运算的规律是:
0 & 0=0
0 & 1=0
1 & 0=0
1 & 1=1
对于参加运算的数要换算为二进制进行运算,例如7 & 2的结果是2,过程如下:
7 & 2
=0111 & 0010
=0010
=2
即 &:按位与运算,两个当且仅当都为1的时候结果才为1,即
1&1 == 1,
1&0 == 0,
0&1 == 0,
0&0 == 0
参考:程序员小灰
参考2:漫画算法:判断2的乘方
package chapter5.part5;
import org.junit.Test;
public class PowerOf2Test {
@Test
public void testPowerOf2() {
boolean result = isPowerOf2(8);
boolean result2 = isPowerOf2V2(8);
boolean result3 = isPowerOf2V3(8);
System.out.println("------老实乖巧版--------");
System.out.println("结果: " + result);
System.out.println("------移位运算版--------");
System.out.println("结果: " + result2);
System.out.println("------位运算妙用版--------");
System.out.println("结果: " + result3);
}
//老实版
private boolean isPowerOf2(int num) {
int temp = 1;
while(temp<=num) {
if(temp == num) {
return true;
}
temp = temp*2;
}
return false;
}
//提高性能版,将乘以2改为向左移位
private boolean isPowerOf2V2(int num) {
int temp = 1;
while(temp <= num) {
if(temp == num) {
return true;
}
temp = temp<<1;
}
return false;
}
/*
* 巧妙运用位运算
n和(n-1)的与运算
*/
private boolean isPowerOf2V3(int num) {
return (num&(num-1)) == 0;
}
}
测试用例: