黑马程序员技术交流社区

标题: 关于编程计算3乘8等于几,什么方法效率更高的拓展。 [打印本页]

作者: kvieta丶心灵    时间: 2014-8-21 17:32
标题: 关于编程计算3乘8等于几,什么方法效率更高的拓展。
今天学完流程控制以后感觉能解答测试题的第一题,于是怀着激动的心情打开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));
                }
        }
}

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



作者: kvieta丶心灵    时间: 2014-8-21 17:38
沙发自己的。
作者: 笑脸迷人    时间: 2014-8-21 17:59
学习下~~~
作者: Jack__Dawson    时间: 2014-8-21 18:11
不错,支持一下
作者: .Mч┞尛__洋    时间: 2014-8-21 18:56
屌爆了                           
作者: 我行我SHOW‰    时间: 2014-8-22 01:01
不错,想的挺全面的~~
作者: 碎流    时间: 2014-8-22 01:31
本帖最后由 碎流 于 2014-8-22 01:33 编辑

学习 .                                             
作者: 李章敏    时间: 2014-8-22 09:36
有意思                                                         
作者: fantacyleo    时间: 2014-8-22 10:47
其实不是2的幂也能算:7 * 3  = 7 * (2 + 1) = 7 << 1 + 7
作者: abc83983682    时间: 2014-8-22 11:02
学习到了
作者: 谢建平    时间: 2014-8-23 04:30
额  知道了
作者: wfaly    时间: 2014-8-23 14:26
谢谢 分享.....
作者: liusj    时间: 2014-8-23 21:34
挺详细的
作者: liusj    时间: 2014-8-23 21:35
挺详细的
作者: 棕榈e人    时间: 2014-8-23 22:03
真是肯钻研,有前途
作者: ︶ㄣ你眼中的倒    时间: 2014-8-24 08:00
好!!!!!!!!!!!!!!!
作者: iefegend    时间: 2014-8-24 08:36
很不错嘛,,潜力股,,,:)
作者: lfs454766767    时间: 2014-8-24 09:06
真是厉害啊!
作者: rao    时间: 2014-8-24 09:42
都知道是右移,但是我用代码写不出来。
作者: 复仇者联盟    时间: 2014-8-24 10:46
楼主的发散思维很是厉害啊,值得我们学习。
作者: 戏言丶    时间: 2014-8-24 11:29
楼主很不错,值得学习
作者: nxp1986    时间: 2014-8-24 11:50
不错,确实想的非常全面
作者: 郑飞    时间: 2014-8-24 11:56
想法很强大 但是就实用性而言 2的10次方以内 肉眼都能瞬间判断 过了10次方(1024) 用这个方法代入算成绩 中奖几率几乎等0 每次都这么判断 得不偿失的
作者: 可无奈    时间: 2014-8-24 12:07
支持下..........................
作者: alexchy    时间: 2014-8-24 18:13
这个看了下思路很清晰,我再细细看看
作者: kvieta丶心灵    时间: 2014-8-25 22:48
rao 发表于 2014-8-24 09:42
都知道是右移,但是我用代码写不出来。

T,T那么多黑马币   其实去书店买本书比什么都好。然后配个笔记本(不是电脑),一边看一边把你理解的记在本子上,然后看完以后就看下笔记本就好了。
作者: kvieta丶心灵    时间: 2014-8-25 22:52
郑飞 发表于 2014-8-24 11:56
想法很强大 但是就实用性而言 2的10次方以内 肉眼都能瞬间判断 过了10次方(1024) 用这个方法代入算成绩 中 ...

首先大神....我们都是小白.... 目测有啥想法都会自己动手实践下,即使错了也是得一份经验,下次就不会再犯这样的错误,其次....我就不能用肉眼看2的7次方以上。怎么破?我觉得能写出来就是成功的。至于代码是否未简这不正是我们这些屌丝考黑马的目的之一么- -、、、、大神你有空就去多出出教程给我们这些小白看看那才叫好。。。
作者: Ezreal    时间: 2014-8-26 09:12
我也来赞一个
作者: sanchibing    时间: 2014-11-8 11:50
学习了,很好。
作者: 禾青青    时间: 2014-11-16 21:08
好吧  学习了
作者: 杨思明    时间: 2015-3-14 16:41
学习了!!
作者: 18230343363    时间: 2015-7-20 09:33
很好的解答,举一反三了
作者: 铿锵的小黑马    时间: 2015-8-19 10:50
    好棒 ...
作者: Urus25    时间: 2015-8-30 20:00
谢谢分享
作者: beimenshisan    时间: 2015-9-11 23:10
不错,支持一下
作者: 梦龙0201    时间: 2015-9-14 22:27
有点麻烦啊,,,,,,




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2