java中移位操作符操作的对象是二进制的位,并且只可以用来操作整数类型。
移位操作符有以下几种类型:
1、左移位操作符(<<):将操作数向左移动指定的位数,并在低位补0。
例如 int i = 10; 求 i << 5。首先将10表示为二进制1010(前面省略28个0),然后向左移动5位并在低位补5个0,就成了101000000(前面省略23个0)。
所以10<< 5 = 320(101000000的十进制表示)。
2、“有符号”右移位操作符(>>):将操作数向右移动指定的位数,若符号为正,则在高位插入0;若符号为负,则在高位插入1。
例如int i = 10; 求 i >> 2。首先将10表示为二进制1010(前面省略28个0),然后向右移动2位,最末尾的两位(10)就被舍去,因为10为正数,所以在最高位插入两个0,就成了10(前面省略30个0)。
所以 10>> 2 = 2(10的十进制表示)。
例如int i = -10;求 i >> 2。首先将-10表示为二进制11111111111111111111111111110110,然后向右移动2位,最末尾的两位(10)被舍去,因为-10为负数,所以在最高位插入两个1,就成了11111111111111111111111111111101。
所以-10>> 2 = -3(上述结果的10进制表示)。
3、“无符号”右移位操作符(>>>):无论正负,都在高位插入0。
例如int i = -10; 求 i >>> 2。首先将-10表示为二进制11111111111111111111111111110110,然后向右移动2位,最末尾的两位(10)被舍去,在高位插入两个0,就成了00111111111111111111111111111101。
所以-10 >>> 2 = 1073741821(上述结果的10进制表示)。
PS:如果对char、byte或者short类型的数值进行移位处理,那么在移位之前,它们会被转换为int类型,并且得到的结果也是int类型。同时,int类型移位操作时,只有右操作数的低5位有用。即a<<b时,只用到了b的低5位。这是因为int类型的长度为32位,除去符号位,为了防止移位超过int型所具有的位数,所以最多移动31位,即b的低5位。
下面通过举例验证:
int i = 1;
i << 31 = 10000000000000000000000000000000;
i << 32 = 1;
i << 33 = 10;
在int移位操作中,对右操作数 31
取低5位后值仍为 31
,因此 i 的值向左移动 31 位;右操作数 32
取低5位后值位 0
,所以 i 的值不移位;右操作数 33
取低5位后为 1
,所以 i 的值只移动 1 位。
同理若对long类型的数值进行移位处理,最后得到的结果也是long类型,此时只会用到右操作数的低6位。
当“移位”与“等号”组合使用时(<<=或>>=或>>>=),可能会遇到一个问题:如果对byte或short值进行这样的移位运算,得到的可能不是正确的结果。它们会先被转换成int类型,再进行移位操作,然后被截断,赋值给原来的类型。