A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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

大功告成。。。所以 求技术分哇哇哇- -。。。。。。。。


评分

参与人数 3技术分 +1 黑马币 +6 收起 理由
Mokill0911 + 5 学以致用,赞个~
masai158 + 1 让尔等祝你一臂之力
滔哥 + 1

查看全部评分

37 个回复

倒序浏览
沙发自己的。
回复 使用道具 举报
学习下~~~
回复 使用道具 举报
不错,支持一下
回复 使用道具 举报 0 1
屌爆了                           
回复 使用道具 举报
不错,想的挺全面的~~
回复 使用道具 举报
碎流 高级黑马 2014-8-22 01:31:07
7#
本帖最后由 碎流 于 2014-8-22 01:33 编辑

学习 .                                             
回复 使用道具 举报
有意思                                                         
回复 使用道具 举报
其实不是2的幂也能算:7 * 3  = 7 * (2 + 1) = 7 << 1 + 7
回复 使用道具 举报
学习到了
回复 使用道具 举报
额  知道了
回复 使用道具 举报
wfaly 中级黑马 2014-8-23 14:26:11
12#
谢谢 分享.....
回复 使用道具 举报
liusj 中级黑马 2014-8-23 21:34:19
13#
挺详细的
回复 使用道具 举报
liusj 中级黑马 2014-8-23 21:35:21
14#
挺详细的
回复 使用道具 举报
真是肯钻研,有前途
回复 使用道具 举报
好!!!!!!!!!!!!!!!
回复 使用道具 举报
很不错嘛,,潜力股,,,:)
回复 使用道具 举报
真是厉害啊!
回复 使用道具 举报
rao 高级黑马 2014-8-24 09:42:00
19#
都知道是右移,但是我用代码写不出来。
回复 使用道具 举报
楼主的发散思维很是厉害啊,值得我们学习。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马