Java中负数的右移
我们知道,在Java中常用的位移运算有三种,分别是:<<(左移)、>>(带符号右移)和>>>(无符号右移)。
这一次,我们来看一下其中的带符号右移运算符>>
在负数计算时的效果。
首先,是一段测试代码:
public static void main(String[] args) {
int num = -10;
System.out.println(num >> 1);
System.out.println(num >> 2);
}
读者可以先思考一下输出为多少?输出:
-5
-3
看到这个结果,可能读者就有点疑问了,一般来说,左移右移不是相当于乘以2或者除以2么,为什么这里会出现-3呢?
我们首先需要明确的是,>>
运算符叫做带符号右移,也即为其在运算时的规则为在要处理的数字的左端补一个等于符号位的数字,即为正数补0,负数补1。可以记为:符号位不变,左边补上符号位。
下面一个问题就是,这个运算符所操作的对象是什么呢?可能第一反应是:不就是左边的这个数么?这么说当然没有问题,但是计算机中存储的数字并不是直观上我们看到的这个数,计算机中所存储和操作的是数字的补码,如果是正数的话,就不用考虑这么多,但是如果是负数的话,就要注意了。
这里,笔者用8位的数字来说明一下为什么’-5 >> 1 = -3`。
首先,我们看一下-5的形式:
源码:1000 0101
反码:1111 1010
补码:1111 1011
左移一位之后:
补码:1111 1101
反码:1111 1100
原码:1000 0011
那么现在看一下,结果-3已经出现了。
因此,在遇到负数的位移运算的时候,写代码之前还是要好好考虑一下的。