黑马程序员技术交流社区

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

作者: 胡建伟    时间: 2013-8-26 21:07
标题: 编程计算3乘8等于几,什么方法效率更高?
本帖最后由 胡建伟 于 2013-8-29 20:37 编辑

下面是我自己的做法,希望各位高手能给出更有效率的方法,请附带注释哦
package com.itheima;
/**
* 2.编程计算3乘8等于几,什么方法效率更高?
* @author xiaowei
*
*/
public class Test2 {

public static void main(String args[]){
  //采用移位运算输出结果
  //System.out.println((2<<3)+(2<<2));本来想把8拆分成2的整数,不过反而麻烦
  System.out.println(3<<3);// 左移相当于乘. 左移一位相当于乘2(2^1);左移两位相当于乘4(2^2);左移三位相当于乘8(2^3)
}

}


作者: 冯超    时间: 2013-8-26 21:10
wuliao`````
作者: 乔兵    时间: 2013-8-26 21:17
毕老师那视频的吧,计算3*8这种左移的方法就是效率最高的了
作者: 胡建伟    时间: 2013-8-26 21:21
乔兵 发表于 2013-8-26 21:17
毕老师那视频的吧,计算3*8这种左移的方法就是效率最高的了

不是啦,是之前做测试题遇到的,毕老师视频也有讲啊?还没看到呢,哪一集啊?


作者: 乔兵    时间: 2013-8-26 21:25
胡建伟 发表于 2013-8-26 21:21
不是啦,是之前做测试题遇到的,毕老师视频也有讲啊?还没看到呢,哪一集啊?

...

http://edu.csdn.net/main/feature/bxd_25.shtml

第二天里面有讲左移右移


作者: 尚前琛    时间: 2013-8-26 21:49
位移那部分讲的很详细,好好研究下{:soso_e130:}
作者: 相许。    时间: 2013-8-26 22:25
左移相当于乘,每左移n位就相当于是乘2的n次方。这一点在视频中讲的很详细了。其效率高是因为直接操作数据中的每一位。而使用其他常量或者变量进行运算之后得到结果的效率明显没有直接操作数据中的每一位的效率更高
作者: 夏夜猫    时间: 2013-8-27 00:23
老毕视屏DAY2说位移运算符那里好像有这个,当时没怎么看懂的
作者: 外面的世界    时间: 2013-8-27 08:14
就是位运算,2 << 3
作者: 汤化峰    时间: 2013-11-25 19:18
知道8可以是2<<<3;那3呢?
作者: RuntimeError!    时间: 2013-11-26 09:55
直接用8移是最快的。。
加的话要经过累加器。。反而麻烦 直接存3的话是3直接走寄存器  ALU 然后直接出来 是一次
加的话是读2 到寄存器到alu,到栈 然后读1到寄存器到ALU,出来的1<<3到寄存器 ,2<<3出栈 到累加器,把寄存器的1<<3取出到累加器 。所以说 直接用3算是最快的。。而且 分开算效率要降到50%以下,可能不到40%
作者: syusikoku    时间: 2014-3-7 19:32
  1.         public static void main(String[] args) {
  2.                 int x=3;
  3.                 //使用移位算法
  4.                 // 1 1 1 1 1 1 1 1
  5.                 // 0 0 0 0 0 0 1 1
  6.                 // 0 0 0 1 1 1 0 0
  7.                 System.out.println(3<<x);
  8.                 //初阶上就是3*(2*2*2)然后得出来的结果。这样就是左往移了三位
  9.                 //往左移一位就要乘以一个2的倍数。这样算就可以了
  10.         }
复制代码

作者: 周定宁    时间: 2014-3-10 17:07
难道说直接乘不是最快的吗??
作者: 龙健    时间: 2014-3-19 22:52
周定宁 发表于 2014-3-10 17:07
难道说直接乘不是最快的吗??

计算机底层都是0,1代码,使用位运算就好比是直接操作计算机的底层硬件,而直接乘则是要经过一系列的转换到底层二进制代码执行,从过程来看,也知道位运算要快一些了、、、、、
作者: 米大米    时间: 2014-4-12 16:09
能运行出来吗  为什么演示的时候有错误提示啊
作者: 胡建伟    时间: 2014-4-12 20:54
米大米 发表于 2014-4-12 16:09
能运行出来吗  为什么演示的时候有错误提示啊

:L.............................................................
作者: God’s favoure    时间: 2014-5-5 10:02
其实还是毕老师讲的方法厉害,我以前都木有想到过。。。。晕菜。
作者: wenrouhaiyang    时间: 2014-5-25 19:00
直接操作数据中的每一位是效率最高的一种方式了,但是题目本身没有意义
作者: 1007087594    时间: 2014-5-26 16:02
这个就是左移右移的问题。
作者: 363758086ed    时间: 2014-5-29 21:52
不错  挺好的
作者: 泛小型    时间: 2014-6-12 19:10
真无聊。。。
作者: 胡建伟    时间: 2014-6-13 21:17
泛小型 发表于 2014-6-12 19:10
真无聊。。。

你这回复岂不是更无聊啊,在你看过老毕讲位移运算视频前,遇到这问题你有头绪吗?不要告诉我你是去百度哈,加油吧,技术分要25分才能面试呢,哥在黑马等你哈
作者: Stevenj    时间: 2014-6-16 20:49
您好,想向您请教下,我先在马上毕业,计算机专业的,考过一次研,但是考的是英语专业的(由于复习的晚,起初考本专业,但由于报名时数学复习的不理想,就报了英语专业),现在面临就业,计算机技术一般,就业的话想先花钱去参加“javaEE+物联云计算”的培训,很喜欢这个方向,但一哥们考上了东北大学计算机,所以也犹豫要不要二战,继续考下东北大学,非常有信心能考上! 希望给些建议,若能回复,万分感谢。(本人男生)。今年政治75,英语74。如果二战的话,需要在C语言、数据结构、数学、上下很大功夫。本科 三流二本,在黑龙江齐齐哈尔市的 齐齐哈尔大学。。。。。其实就是就业(分两种,一种先培训,一种直接到公司满满学习)和考研选择上的利与弊,要是你处在我的情景时,会怎么办!感谢你的回复

作者: 胡建伟    时间: 2014-6-18 00:46
Stevenj 发表于 2014-6-16 20:49
您好,想向您请教下,我先在马上毕业,计算机专业的,考过一次研,但是考的是英语专业的(由于复习的晚,起 ...

如果心中还是有研究生情节的话,那你还是坚持复习备考,为自己的梦想再试一把,如果想早点就业,不像在考研上学了,而自己技术一般那就可以来黑马或者传智播客,这里还是很靠谱的,如果网上流程没过,可以先上传智播客或者黑马也开了免费基础班,可以更顺利考上黑马,我也是这么过来的.当然条条大路通罗马,如果你自己可以找到份不错的工作,或者有关系的话,没必要再培训,我同学没上黑马,北京干一年半java,现在也照样10k,如果前面说的都没有那,强烈推荐你来黑马学习,出去后工资也很可观,28期那些大神,平均工资都快10k了,9936啊
作者: Stevenj    时间: 2014-6-18 15:05
胡建伟 发表于 2014-6-18 00:46
如果心中还是有研究生情节的话,那你还是坚持复习备考,为自己的梦想再试一把,如果想早点就业,不像在考研上 ...

兄台,谢谢你的建议,thank you!
作者: Stevenj    时间: 2014-6-19 14:14
Stevenj 发表于 2014-6-18 15:05
兄台,谢谢你的建议,thank you!

恩恩, 是啊,坚持到最后的都会有收获
作者: 泛小型    时间: 2014-6-25 01:27
胡建伟 发表于 2014-6-13 21:17
你这回复岂不是更无聊啊,在你看过老毕讲位移运算视频前,遇到这问题你有头绪吗?不要告诉我你是去百度哈,加 ...

  不好意思我说错话了
作者: 胡建伟    时间: 2014-7-20 21:24
泛小型 发表于 2014-6-12 19:10
真无聊。。。

你这回复岂不是更无聊啊,在你看过老毕讲位移运算视频前,遇到这问题你有头绪吗?不要告诉我你是去百度哈,再说哥这帖子都发了多久了,你不去论坛里去看新帖子,新提问积攒积分,在这做无聊评论,浪费时间,有能力尽快通过面试来黑马啊,哥在这里都快毕业了;P
作者: bigworld    时间: 2014-8-21 15:33
胡建伟 发表于 2014-7-20 21:24
你这回复岂不是更无聊啊,在你看过老毕讲位移运算视频前,遇到这问题你有头绪吗?不要告诉我你是去百度哈,再 ...

前辈你是通过先学免费的基础班再转入培训的吗?
我基础不太好~不知道能不能通过面试
作者: xhbxhb    时间: 2014-8-31 22:15
我也需要学习学习
作者: Kikyou2014    时间: 2014-11-6 12:27
左移<<<3位就好了
作者: Always,    时间: 2015-4-15 11:00
                 赞,
作者: wangxiaocong    时间: 2015-4-29 13:40
非常感谢!
作者: a397131103    时间: 2015-5-16 22:24
        public static void main(String[] args) {
                //计算机底层都是2进制,直接操作2进制是最快的.位运算是直接对二进制进行运算.
                //3*8=3*(2*2*2) 往左移一位就要乘以一个2的倍数 ,这样就是左移了三位
        int x = 3 << 3;
        System.out.println("3*8的值:"+x);
        }
作者: 飘影    时间: 2015-6-28 14:38
咦,学习了!
作者: 边情2015    时间: 2015-9-28 11:14
你说的只是算3*8,直final 24不是更快吗{:2_30:}
作者: 凌晨两点半    时间: 2015-10-11 13:01
谢谢分享
作者: 野出岔子    时间: 2015-10-24 17:26
汤化峰 发表于 2013-11-25 19:18
**** 作者被禁止或删除 内容自动屏蔽 ****

8是2<<3,电脑中数据是二进制的,乘以8就是被乘数向左移动3位,你问的3,是题目中的乘数3.也就是3*8,那么应该是,3<<3。
作者: 爱斯基摩    时间: 2015-11-16 22:51
这个真的是学习了,还以为是加法最快呢
作者: huanlong579    时间: 2016-3-1 22:37
理论上应该是位移速度快,但是,我做实验是时候,发现直接相乘有时候比位移快,求解释
作者: huanlong579    时间: 2016-3-1 22:38
public class Test2
{

        public static void main(String[] args)
        {       
                FunctionOne();
                FunctionTwo();
                for(int i=1;i<10;i++)//照理来说应该是位移运算是最快的,可是在我机器运行,多次运行!然后比较2者运算时间不确定
                {
                        FunctionOne();
                        FunctionTwo();
                }                       
        }

        private static void  FunctionOne()//方法1:直接相乘 看处理器时间
        {
                int result=0;//保存结果               
                long pre=System.currentTimeMillis();//当前时间
                long post=0;//保存运行结束后时间
                for(int i=0;i<100000000;i++)//运行1亿次,看运行时间
                         result = 3*8;
                post=System.currentTimeMillis();
                System.out.println("方法1 运行时间为:"+(post-pre)+" ms"+"  3乘8的结果为:"+result);
        }
       
        private static void FunctionTwo()//通过位移 左移3位,相当于成8,理论上速度更快!
        {
                int result=0;//保存结果               
                long pre=System.currentTimeMillis();//当前时间
                long post=0;//保存运行结束后时间
                for(int i=0;i<100000000;i++)//运行1亿次,看运行时间
                         result = 3<<3;
                post=System.currentTimeMillis();
                System.out.println("方法2 运行时间为:"+(post-pre)+" ms"+"  3乘8的结果为:"+result);
        }
               
}




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