首页 > 代码库 > 判断是否为2的N次方并取N
判断是否为2的N次方并取N
今天学完流程控制以后感觉能解答测试题的第一题,于是怀着激动的心情打开eclipse。废话不多说。。看代码.
package com.itheima;
/**
* 第一题:编程计算3乘8等于几,什么方法效率更高?
* @author LiQing
*
* 思路:因为计算机处理数据都是二进制,而8等于2的3次方。
* 所以可以用移位运算符中的左移运算符计算此题效率会更高。
*/
public class Test1
{
public static void main(String[] args)
{
System.out.println(3<<3);
}
}
然后发现这种方法有局限性,不是2的N次方咋办呢。然后我就写了一个判断。代码如下:
/* 因为此方法有一定的局限性,所以得对乘数进行判断,
* 如果这个数是2的n次方的整数,就用左移运算。不是就用正常运算。
*/
public class Test1
{
/* 因为以2为底数的n次方的整数的二进制只有最高位是1,其他都为0.
* 如果&上一个同位数且最高位是0其余的是1的数结果就为0.例如:
* 1000&0111=0,10&01=0,100&001=0......
* 而这个数就是以2为底数的n次方的整数减去1.
* 判断完是否为2为底数的n次方后,然后取n的值。
* 因为2(10)=2的1次方,4(100)=2的2次方,8(1000)=2的3次方。。。。。。
* 只要我们取这个数的二进制位数减1即为所求。
* 取这个数的二进制位数可以通过&1判断是否为1.不为1就向右移动一位在进行判断。
*/
public static void main(String[] args)
{
int x=3;
int y=2;
int z=0;//用来记录移位运算的次数。初始值设为0就不用减一了。
//以2为底数的n次方的整数肯定大于1的。加个y>0防止用户输入错误数据。
if((y > 0) && ((y & (y - 1)) == 0))//当y满足y>0且y&(y-1)=0时这个数就是以2为底数的n次方的整数。
{
while((y&1)==0)
{
y>>=1;
z++;
}
System.out.println("这是移位运算的结果:"+(x<<z));
}
else
{
System.out.println("这是正常运算的结果:"+(x*y));
}
}
}