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

居高声自远

初级黑马

  • 黑马币:

  • 帖子:

  • 精华:

© 居高声自远 初级黑马   /  2015-1-17 18:47  /  3517 人查看  /  21 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

6黑马币
我知道2*8,也就是2乘以2的3次,就是2左移三位。
哪位朋友知道这题怎么做?用最有效率的方式计算2*7。这个2不能被7整除。      

最佳答案

查看完整内容

这个只能用(2

21 个回复

倒序浏览
本帖最后由 a3563365 于 2015-1-18 22:48 编辑

这个只能用(2<<3)-2了吧...这样是最优的....不知道楼主学过数字电子技术没有....计算机是电器的一种...电器是用状态储存数据....也就是计算机的0和1形式....计算机用来计算是通过电路进行的....具体的我不说的太细...总之计算机做乘法和除法是比加法和减法耗性能的多....其实这里说的还不对...计算机其实根本就不分加法和减法...都是加法...这个又涉及到原码.反码和补码的知识...计算机存储数据用的是数据的补码的0 1 形式...负数的的补码是除了符号位外所有位数取反最后再加1...正数加负数的结果就是补码直接相加..如果最高位溢出直接舍弃...运算结果完全正确.......   如果这样你记不住的话你就记计算机是不会算乘法的...电器算乘法要么用特殊结构...要么就用多重相加....特殊结构又导致成本增加...所以你就当做 计算机算2*3  相当于 算2+2+2  这样...所以才耗费性能...虽然不准确...但大体一致 ... 同时,学过数电的都知道,移位操作所用的电路非常简单...性能非常高...所以前一半用移位操作...当移位操作不能完全满足性能要求的时候用加法(减法也是加法)操作在电路的运行过程中所用的时间是最少的...我觉得这样是最节省性能的...如果楼主得到更好的答案记得告诉我哈~
回复 使用道具 举报
7左移两位咯。但是为什么为什么要整除2呢
回复 使用道具 举报
初_学者 发表于 2015-1-17 23:35
7左移两位咯。但是为什么为什么要整除2呢

左移,都是以2为基数呀。
回复 使用道具 举报
初_学者 发表于 2015-1-17 23:35
7左移两位咯。但是为什么为什么要整除2呢

我更新知道你解这题的思路。步骤。你一下来个结果,我肯定就挂了。
回复 使用道具 举报
本帖最后由 邓士林 于 2015-1-18 13:52 编辑

7的二进制,111,左移两位11100,即28,这不是开玩笑么!显然不对,思路就是:表达出7的二进制,左移一位,任何数与2相乘,都是可以将此数的二进制左移一位,如果不是2的倍数,最好的方法还不知道,生活中用到的计算机很快就计算出来了,不必太纠结这个。
回复 使用道具 举报
位运算是在二进制上做的,左移就是扩大2的多少次幂
回复 使用道具 举报
本帖最后由 居高声自远 于 2015-1-18 15:38 编辑
邓士林 发表于 2015-1-18 13:48
7的二进制,111,左移两位11100,即28,这不是开玩笑么!显然不对,思路就是:表达出7的二进制,左移一位, ...

2*8 是2<<3
我更想知道遇到这题到底应该怎么计算   2*7   
回复 使用道具 举报
本帖最后由 居高声自远 于 2015-1-18 15:50 编辑
邓士林 发表于 2015-1-18 13:48
7的二进制,111,左移两位11100,即28,这不是开玩笑么!显然不对,思路就是:表达出7的二进制,左移一位, ...


2*7
如果在面试中遇到这样题目,可怎么办?
回复 使用道具 举报
居高声自远 发表于 2015-1-18 15:40
2*7
如果在面试中遇到这样题目,可怎么办?

我上网看了一些资料,你可以参考下,其实谈到优化,系统已经会充分优化计算,不然一种编译环境进行计算都很慢,那么在好的语言也得打广泛使用。
http://blog.csdn.net/snipersun/article/details/5618087
回复 使用道具 举报
是啊,老师讲过位运算是计算机高效的一种算法,我觉得是(2<<3)-2,这样就是计算机只需要进行一次位运算和一次加法运算就行了
回复 使用道具 举报

你好,我想问下这个表达式是怎么来的。(2<<3)-2
回复 使用道具 举报
居高声自远 发表于 2015-1-22 01:00
你好,我想问下这个表达式是怎么来的。(2

原来是2,左移一位是4,左移两位是8,左移三位是16,你要的时2*7结果为14,所以只能-2啊,就是这么来的,
回复 使用道具 举报
2*(8-1)=2*8-2=2<<3-2
回复 使用道具 举报
2*(8-1)=2*8-2=(2<<3)-2

  1. (2<<3)-2;
复制代码
回复 使用道具 举报
把7左移一位不就是7乘以2的一次了吗?这样会不会提高点效率呢?
回复 使用道具 举报
过来长见识了。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马