JAVA基础位运算符

位移操作:

只针对 int类型的数据有效,java中,一个int的长度始终是32位,就是4个字节,它操作的都是该整数的二进制数)

也可以作用于以下类型,即 byte,short,char,long(当然,它们都是整数形式)。这四种类型是,JVM先把它们转换成int型再进行操作。
(1) << 左移
(2) >> 右移
(3) >>> 无符号右移
<< 和 >>为数值位移,>>>为逻辑位移。
【注】:Java中不存在<<<。

m<<n的含义

把整数m表示的二进制数左移n位,高位移出n位都舍弃,低位补0. (此时将会出现正数变成负数的形式)
例如:
左移使整数变为负数:
10737418<<8
10737418二进制表示形式:00000000 10100011 11010111 00001010,
按照$1的原理,得到10100011 11010111 00001010 00000000,即为:-1546188288.

m>>n的含义

把整数m表示的二进制数右移n位, m为正数,高位全部补0;m为负数,高位全部补1.
实 例:
3>>2剖析:
3二进制形式: 00000000 00000000 00000000 00000011,
按照$2的原理,得到00000000 00000000 00000000 00000000,即为0.
-3>>2剖析:
-3二进制形式: 11111111 11111111 11111111 11111101,
按照$2的原理,得到11111111 11111111 11111111 11111111,即为-1.

m>>>n的含义

整数m表示的二进制右移n位,不论正负数,高位都补零。
实例:
3>>>2剖析:
3二进制形式: 00000000 00000000 00000000 00000011,按照$3的原理,得到00000000 00000000 00000000 00000000,即为0.
-3>>>2剖析:
-3二进制形式: 11111111 11111111 11111111 11111101,按照$3的原理,得到00111111 11111111 11111111 11111111,即为1073741823.

【注】:对于上述三种情况,如果n为负数:这时JVM会先让n对32取模,变成一个绝对值小于32的负数,然后再加上32,直到 n 变成一个正数。
实例:
   4<<-10
   4的二进制形式:00000000 00000000 00000000 00000100,-10对32取模再加上32,得到22,则4<<-10,即相当于4<<22。
   此时按照再按照m<<n原理,得到00000001 00000000 00000000 00000000,得到的即为:16777216。

综上所述:
   m<<n即在数字没有溢出的前提下,对于正数和负数,左移n位都相当于m乘以2的n次方.
   m>>n即相当于m除以2的n次方,得到的为整数时,即为结果。
   如果结果为小数,此时会出现两种情况:
   	(1)如果m为正数,得到的商会无条件的舍弃小数位;
   	(2)如果m为负数,舍弃小数部分,然后把整数部分加+1得到位移后的值。

接下来在此说说位操作的好处,速度超快,这些都是底层的二进制机器操作指令。
比如:a2,
1.jvm先为变量a分配空间;
2.再进行a
2的操作;
3.再把结果返回给相应的变量。
而 a<<1,和a*2一样,它只需要一条指令即可,速度很快。当然前三种位移操作都是对2的倍数进行操作时可用。

声明:本文转自http://uule.iteye.com/blog/2095860

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值