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 个回复

正序浏览
有点麻烦啊,,,,,,
回复 使用道具 举报
不错,支持一下
回复 使用道具 举报
谢谢分享
回复 使用道具 举报
    好棒 ...
回复 使用道具 举报
很好的解答,举一反三了
回复 使用道具 举报
学习了!!
回复 使用道具 举报
好吧  学习了
回复 使用道具 举报
学习了,很好。
回复 使用道具 举报
我也来赞一个
回复 使用道具 举报
郑飞 发表于 2014-8-24 11:56
想法很强大 但是就实用性而言 2的10次方以内 肉眼都能瞬间判断 过了10次方(1024) 用这个方法代入算成绩 中 ...

首先大神....我们都是小白.... 目测有啥想法都会自己动手实践下,即使错了也是得一份经验,下次就不会再犯这样的错误,其次....我就不能用肉眼看2的7次方以上。怎么破?我觉得能写出来就是成功的。至于代码是否未简这不正是我们这些屌丝考黑马的目的之一么- -、、、、大神你有空就去多出出教程给我们这些小白看看那才叫好。。。
回复 使用道具 举报
rao 发表于 2014-8-24 09:42
都知道是右移,但是我用代码写不出来。

T,T那么多黑马币   其实去书店买本书比什么都好。然后配个笔记本(不是电脑),一边看一边把你理解的记在本子上,然后看完以后就看下笔记本就好了。
回复 使用道具 举报
这个看了下思路很清晰,我再细细看看
回复 使用道具 举报
支持下..........................
回复 使用道具 举报
想法很强大 但是就实用性而言 2的10次方以内 肉眼都能瞬间判断 过了10次方(1024) 用这个方法代入算成绩 中奖几率几乎等0 每次都这么判断 得不偿失的
回复 使用道具 举报
不错,确实想的非常全面
回复 使用道具 举报
楼主很不错,值得学习
回复 使用道具 举报
楼主的发散思维很是厉害啊,值得我们学习。
回复 使用道具 举报
rao 高级黑马 2014-8-24 09:42:00
20#
都知道是右移,但是我用代码写不出来。
回复 使用道具 举报
真是厉害啊!
回复 使用道具 举报
很不错嘛,,潜力股,,,:)
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马