黑马程序员——判断是否为2的N次方并取N

时间:2021-11-23 12:39:25

----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------

今天学完流程控制以后感觉能解答测试题的第一题,于是怀着激动的心情打开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));
                }
        }
}