黑马程序员技术交流社区

标题: 位移效率问题 [打印本页]

作者: 余海龙    时间: 2012-2-8 20:38
标题: 位移效率问题
本帖最后由 余海龙 于 2012-2-9 14:15 编辑

2<<3与 2*8的结果是相同的。

为什么2<<3  的运算效率比 2*8 的效率高?
作者: 杜明辉    时间: 2012-2-8 20:39
位移的概念:
1.位移运算符只对位进行操作
2.只能操作int整型数据类型
3.右移补高位,左移补底位
>> 有正负之分的右位移运算符,把字节向右移由右边操作数指定的位数,如果左边操作数是正数,则移动的高位补0 ,反之则补1
>>>无符号之分的右移运算符,即不管左边操作数的正负,高位都补0
<< 左移运算符,向左移动由右边操作数指定的位数,移动后底位自动补0
作用:
对于大数据的2进制运算,位移运算符比那些普通运算符的运算要快很多,因为程序仅仅移动一下而已,不去计算,这样提高了效率,节省了资源.


作者: 秦碧    时间: 2012-2-8 20:42
因为左移实际上是二进制操作 只需要将10左移3位 再补0即可
而2*8需要
10*1000 需要进行分解后的乘法和加法运算才能算出来结果
作者: 余海龙    时间: 2012-2-8 20:42
2*8在计算机内存中的原理是什么?请帮忙解释一下,谢谢!
作者: 杜明辉    时间: 2012-2-8 20:48
2*8的结果在内存中就是2<<3
java虚拟机会自动转换。
作者: 最初的理想    时间: 2012-2-8 20:49
程序设计中效率最高的是直接对寄存器等硬件进行编程,比如汇编语言,高级语言虽然与开发者的界面更友好但是要在底层上运行还需要进过编译
优化等中间环节,因此在效率上不能与低级语言相比,位运算是低级语言的典型特征,当然2<<3的效率比2*8高很多。
作者: 冯心程    时间: 2012-2-8 21:00
北京人*火车=天津  
北京人*回城符=天津
一个道理
计算机里乘法与你知道的乘法一样 就是是用2进制表示的 很长 然后每个数依次相乘再相加 要是人算都能累死  最后得出得数还要换算成10进制
位移就不一样 直接在前面或后面填缺少的0或1就行 然后直接用10进制表示
作者: 彭泳    时间: 2012-2-8 21:39
<< 位左移  

TAG:位运算,位运算符,位移运算符,位左移
TEXT:
左移运算的实质是将对应的数据的二进制值逐位左移若干位,并在空出的位置上填0,最高位溢出并舍弃。例如
int a,b;
a=5;
b=a<<2;
则b=20,分析过程如下:
(a)10=(5)10=(0000 0000 0000 0101)2
b=a<<2;
b=(0000 0000 0001 0100)2=(20)10
从上例可以的知b/a=4=22,可以看出位运算可以实现二倍乘运算。由于位移操作的运算速度比乘法的运算速度高很多。因此在处理数据的乘法运算的时,采用位移运算可以获得较快的速度。
提示 将所有对2的乘法运算转换为位移运算,可提高程序的运行效率


REF:.txt  
>> 位右移  

TAG:位运算,位运算符,位移运算符,位右移
TEXT:
右移运算的实质是将对应的数据的二进制值逐位右移若干位,并舍弃出界的数字。如果当前的数为无符号数,高位补零。例如:
int (a)10=(5)10=(0000 0000 0000 0101)2
b=a>>2;
b=(0000 0000 0000 0001)2=(1)10
如果当前的数据为有符号数,在进行右移的时候,根据符号位决定左边补0还是补1。如果符号位为0,则左边补0;但是如果符号位为1,则根据不同的计算机系统,可能有不同的处理方式。
可以看出位右移运算,可以实现对除数为2的整除运算。
提示 将所有对2的整除运算转换为位移运算,可提高程序的运行效率
REF:.txt





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