最快的方式是利用移位运算符跟位移运算符,因为不用压栈,直接在内存中操作,效率很高。
第一种方式的思想是: 只要该数是2的n次方,那么该数的二进制表示中,除去符号位外,只有1个1。
利用Java实现的代码如下
@Test
public void testNum(){
Scanner sc = new Scanner(System.in);
System.out.print("请输入一个整数:");
//记录下与1做与运算结果为1的次数
int temp = 0;
if(sc.hasNextLine()){
int num = Integer.parseInt(sc.nextLine());
for (int i = 0; i < 32; i++) {
if(((num >> i) & 1) == 1){
temp++;
if(temp > 1){
break;
}
}
}
}
if(temp == 1){
System.out.println("该数可由2的n次方得到");
}else{
System.out.println("该数不可由2的n次方得到");
}
}
2.第二种方式是在网上看到的,非常简单,而且经测试,效率也十分快。
if(n > 0 && (n & (n-1) == 0 ) ){
//可由2的n次方得到
}