Java基础篇:右移运算符

本文介绍了Java中的右移运算符>>,它将指定值的所有位右移指定次数。移位过程中,丢弃移出的位,且根据原始数值的符号填充最高位。通过右移,可以快速实现整数的2的幂次除法。对于负数,右移会保留符号位,如-8右移1位得到-4。在某些场景下,如转换byte为十六进制表示,可能需要避免符号位扩展,此时可以通过与0x0f进行按位与来达到目的。

右移运算符>>使指定值的所有位都右移规定的次数。它的通用格式如下所示:

value >> num

这里,num指定要移位值value移动的位数。也就是,右移运算符>>使指定值的所有位都右移num位。
下面的程序片段将值32右移2次,将结果8赋给变量a:

int a = 32; 
a = a >> 2; // a now contains 8

当值中的某些位被“移出”时,这些位的值将丢弃。例如,下面的程序片段将35右移2次,它的2个低位被移出丢弃,也将结果8赋给变量a:

int a = 35; 
a = a >> 2; // a still contains 8

用二进制表示该过程可以更清楚地看到程序的运行过程:
00100011 35
>> 2
00001000 8
将值每右移一次,就相当于将该值除以2并且舍弃了余数。你可以利用这个特点将一个整数进行快速的2的除法。当然,你一定要确保你不会将该数原有的任何一位移出。
右移时,被移走的最高位(最左边的位)由原来最高位的数字补充。例如,如果要移走的值为负数,每一次右移都在左边补1,如果要移走的值为正数,每一次右移都在左边补0,这叫做符号位扩展(保留符号位)(sign extension),在进行右移操作时用来保持负数的符号。例如,–8 >> 1 是–4,用二进制表示如下:
11111000 –8
>>1
11111100 –4
一个要注意的有趣问题是,由于符号位扩展(保留符号位)每次都会在高位补1,因此-1右移的结果总是–1。
有时你不希望在右移时保留符号。例如,下面的例子将一个byte型的值转换为用十六进制表示。注意右移后的值与0x0f进行按位与运算,这样可以舍弃任何的符号位扩展,以便得到的值可以作为定义数组的下标,从而得到对应数组元素代表的十六进制字符。

// Masking sign extens
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值