黑马程序员技术交流社区

标题: 关于位运算 [打印本页]

作者: 居高声自远    时间: 2015-1-17 18:47
标题: 关于位运算
我知道2*8,也就是2乘以2的3次,就是2左移三位。
哪位朋友知道这题怎么做?用最有效率的方式计算2*7。这个2不能被7整除。      

作者: a3563365    时间: 2015-1-17 18:47
本帖最后由 a3563365 于 2015-1-18 22:48 编辑

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

左移,都是以2为基数呀。
作者: 居高声自远    时间: 2015-1-18 12:16
初_学者 发表于 2015-1-17 23:35
7左移两位咯。但是为什么为什么要整除2呢

我更新知道你解这题的思路。步骤。你一下来个结果,我肯定就挂了。
作者: 邓士林    时间: 2015-1-18 13:48
本帖最后由 邓士林 于 2015-1-18 13:52 编辑

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


2*7
如果在面试中遇到这样题目,可怎么办?
作者: 邓士林    时间: 2015-1-18 18:04
居高声自远 发表于 2015-1-18 15:40
2*7
如果在面试中遇到这样题目,可怎么办?

我上网看了一些资料,你可以参考下,其实谈到优化,系统已经会充分优化计算,不然一种编译环境进行计算都很慢,那么在好的语言也得打广泛使用。
http://blog.csdn.net/snipersun/article/details/5618087
作者: 流星划过的黎明    时间: 2015-1-21 23:56
是啊,老师讲过位运算是计算机高效的一种算法,我觉得是(2<<3)-2,这样就是计算机只需要进行一次位运算和一次加法运算就行了
作者: 居高声自远    时间: 2015-1-22 01:00
a3563365 发表于 2015-1-18 22:46
这个只能用(2

你好,我想问下这个表达式是怎么来的。(2<<3)-2
作者: a3563365    时间: 2015-1-22 02:00
居高声自远 发表于 2015-1-22 01:00
你好,我想问下这个表达式是怎么来的。(2

原来是2,左移一位是4,左移两位是8,左移三位是16,你要的时2*7结果为14,所以只能-2啊,就是这么来的,
作者: 朋好友    时间: 2015-1-23 23:21
2*(8-1)=2*8-2=2<<3-2
作者: 朋好友    时间: 2015-1-23 23:25
2*(8-1)=2*8-2=(2<<3)-2

  1. (2<<3)-2;
复制代码

作者: fightingwang    时间: 2015-1-25 22:33
把7左移一位不就是7乘以2的一次了吗?这样会不会提高点效率呢?
作者: VitaminesPop    时间: 2015-3-4 10:47
过来长见识了。。。




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