移位运算符操作的对象就是二进制的位,可以单独用移位运算符来处理int型整数。Java中有三种移位运算符:
运算符 | 含义 | 例子 |
<< | "有符号"左移运算符,将运算符左边的对象向左移动运算符右边指定的位数(在低位补0) | x<<3 |
>> | "有符号"右移运算符,将运算符左边的对象向右移动运算符右边指定的位数。使用符号扩展机制,也就是说,如果值为正,则在高位补0,如果值为负,则在高位补1。 | x>>3 |
>>> | "无符号"右移运算符,将运算符左边的对象向右移动运算符右边指定的位数。采用0扩展机制,也就是说,无论值的正负,都在高位补0。 | x>>>3 |
下面以5和-5为例说明
-5原码:10000000 00000000 00000000 00000101
-5反码:11111111 11111111 11111111 11111010
-5补码:11111111 11111111 11111111 11111011
5原码: 00000000 00000000 00000000 00000101
5反码: 00000000 00000000 00000000 00000101
5补码: 00000000 00000000 00000000 00000101
右移: -5>>2(-2)
新值补码:11111111 11111111 11111111 11111110(对补码进行右移两位,最高位不变,次高两位补1,末尾两位去掉)
新值反码:11111111 11111111 11111111 11111101(对新值进行-1操作)
新值原码:10000000 00000000 00000000 00000010(最高位不变,其他位取反)
左移: -5<<2(-20)
新值补码:11111111 11111111 11111111 11101100(对补码进行左移两位,最高位不变,次高两位去掉,末尾补两位0)
新值反码:11111111 11111111 11111111 11101011(对新值补码进行-1操作)
新值原码:10000000 00000000 00000000 00010100(对反码进行最高位不变,其他位取反)
右移: 5>>2(1)
新值原、反、补码:00000000 00000000 00000000 000001(右移两位,最高位不变,次高两位补0,末尾两位去掉)
左移: 5<<2(20)
新值原、反、补码:00000000 00000000 00000000 00010100(左移两位,最高位不变,次高两位去掉,末尾补两位0)
右移: -5>>>2(1073741822)
新值原、反、补码:00111111 11111111 11111111 11111110(对补码进行右移两位,前高两位补0,末尾两位去掉)
右移: 5>>>2(1)
新值原、反、补码:00000000 00000000 00000000 000001(右移两位,最高位不变,次高两位补0,末尾两位去掉)