java之位移运算

1. java移位运算小技巧

左移一位相当于乘以2的1次方,左移n位就相当于乘以2的n次方。 
右移一位相当于除以2的1次方,右移n位就相当于除以2的n次方。 
比如 
10 << 1 = 20 
10 << 3 = 80 
6 >> 1 = 3 
6 >> 2 = 1

想要深入理解移位运算,就一定要对计算机的原码、反码、补码非常熟练。 
可以参考:点我

你要知道3个事: 
(1)机器都是使用补码,运算也是使用补码运算。 
(2)正数的原码补码反码都一样。 
(2)补码与原码相互转换,其运算过程是相同。

2. 原码,反码,补码

java里byte是占1个字节的,1个字节等于8个位。8个位里的第1位是符号位,用来表示是正数还是负数。 
所以byte能表示的最大机器数也就是[0111 1111],也就是255。

正整数的反码,补码和原码相同,负整数的反码是除了符号位以外取反,负数的补码为反码+1

byte a = 5 ; 
[ +5 ] = 原码[ 0000 0101 ] = 反码[ 0000 0101 ] = 补码[ 0000 0101 ] 
[ -5 ] = 原码[ 1000 0101 ] = 反码[ 1111 1010 ] = 补码[ 1111 1011 ]

3. 怎么进行移位运算

移位运算符分左移位(<<)、右移(>>)、无符号右移(<<<) 
其中无符号右移这里就不讨论了,java里没用到。

(1)左移 
运算方式:数值的补码全部往左移动X位,符号位和最高位都舍弃,最低位补0。 
正数: 
int a = 5 ; 
int b = a << 2 ; 
[ 0000 0000 0000 0000 0000 0000 0000 0101 ] 5的补码 
[ 0000 0000 0000 0000 0000 0000 0001 0100 ] 对于正数而言,反码就是原码,即 20

负数: 
int a = -5 ; 
int b = a << 2 ; 
[ 1000 0000 0000 0000 0000 0000 0000 0101 ] -5的原码 
[ 1111 1111 1111 1111 1111 1111 1111 1010 ] -5的反码 
[ 1111 1111 1111 1111 1111 1111 1111 1011 ] -5的补码 
[ 1111 1111 1111 1111 1111 1111 1110 1100 ] a<<2左移2位 
将补码转换成原码就可以得到数值,补码转原码和原码转补码一样,上面说过了。 
[ 1000 0000 0000 0000 0000 0000 0001 0011 ] 
[ 1000 0000 0000 0000 0000 0000 0001 0100 ] 得到a<<2的原码,即 -20 
左移n位就相当于乘以2的n次方

(2)右移 
运算方式:数值的补码向右移X位,符号位不变(左边补上符号位) 
正数: 
int a = 8 ; 
int b = a >> 1; 
[ 0000 0000 0000 0000 0000 0000 0000 1000 ] 8的反码 
[ 0000 0000 0000 0000 0000 0000 0000 0100 ] a>>1向右移1位 
正数的反码就是原码,上面提过了两次,所以a>>1= 4

负数: 
int a = -8 ; 
int b = a >> 1 ; 
[ 1000 0000 0000 0000 0000 0000 0000 1000 ] -8的原码 
[ 1111 1111 1111 1111 1111 1111 1111 0111 ] -8的反码 
[ 1111 1111 1111 1111 1111 1111 1111 1000 ] -8的补码 
[ 1111 1111 1111 1111 1111 1111 1111 1100 ]  a>>1向右移1位 
补码转原码 
[ 1000 0000 0000 0000 0000 0000 0000 0011 ] 
[ 1000 0000 0000 0000 0000 0000 0000 0100 ]  得到a>>1的原码,即 -4 
右移n位相当于除以2的n次方

4. java里为什么要使用移位运算符

用移位操作可以极大地提高性能,因为在计算机底层对位的操作是最快的,没有之一!移位操作虽然快,但是可能会使代码不太好理解,因此最好加上相应的注释。

转载于:https://my.oschina.net/wugong/blog/1615561

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值