黑马程序员技术交流社区

标题: 答疑! [打印本页]

作者: Hello_world_    时间: 2013-7-29 07:10
标题: 答疑!
本帖最后由 杨兴庭 于 2013-7-29 17:46 编辑

编写代码,用最有效率的方法计算出2乘以8等于几?
一道考试题!网上有很多说法,但是感觉没啥关系啊,直接输出多快啊!

作者: breaveheart    时间: 2013-7-29 07:59
采用二进制移位的方式运算效率最高,毕向东老师的视频里有教学。
其实2*8也就是二进制表示下的2左移3位。
毕老师教学视频里第二天的为运算符(左移右移)里有详细解释,你可以看看。
作者: Mr_Free    时间: 2013-7-29 08:48
2<<3,
把8看作2的3次方,int x = 2*2的3次;  x=2<<3; 位运算的方式做运算是最快的。

我来说一下为什么? 其实我也是在网上查了下资料,觉得解释还行就搬运过来了。
位移运算调的是 ishl  (将 int 型数值左移位指定位数并将结果压入栈顶)指令,乘法运算调的是   imul (将栈顶两 int 型数值相乘并将结果压入栈顶)指令。
整数乘法或整数除法所需要的时钟周期远远大于移位操作所需的时钟周期,下面列出这个指令的基本执行时间:
移位指令               寄存器移 1 位         时钟周期数为 2  
整数乘法 IMUL        16 位寄存器乘         时钟周期为 128 ~ 154
整数除法 IDIV        16 位寄存器            时钟周期为 165 ~ 184

作者: Hello_world_    时间: 2013-7-29 08:51
也就是你知道是8了  然后换成汇编指令  让2编程8啊  何苦不直接输出个8。掩耳盗铃之嫌,何苦了!
作者: Hello_world_    时间: 2013-7-29 08:52
breaveheart 发表于 2013-7-29 07:59
采用二进制移位的方式运算效率最高,毕向东老师的视频里有教学。
其实2*8也就是二进制表示下的2左移3位。
...

这个我看过,就是心理觉得没必要!直接输出8和你这样生搬硬套成8不是一个道理么 !你心里都知道是8
作者: Hello_world_    时间: 2013-7-29 08:53
把8看作2的3次方(还是人脑计算),int x = 2*2的3次;  x=2<<3; 位运算的方式做运算是最快的。
作者: 王广亚    时间: 2013-7-29 09:15
计算机都是二进制计算的,就算你直接写代码是写成2*8,计算机也要把他们转换成二进制,这样是不是效率下降了啊。如果你直接用二进制操作的话是不是效率就高了。而位运算是对数的二进制操作的。所以用2<<3是效率最高的操作。2 的二进制表现形式为0000-0000 0000-0000 0000-0000 0000-0010,左移三位后为0-0000 0000-0000 0000-0000 0000-0010000
作者: Hello_world_    时间: 2013-7-29 09:26
王广亚 发表于 2013-7-29 09:15
计算机都是二进制计算的,就算你直接写代码是写成2*8,计算机也要把他们转换成二进制,这样是不是效率下降 ...

有点感觉了!
作者: 柏圣杰    时间: 2013-7-29 22:45
用移位运算是计算机执行最快的,直接对二进制操作,...2<<3就可以了




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