Java 中的三种位移运算符
java中有三种移位运算符
<< : 左移运算符,num << 1,相当于num乘以2
>> : 右移运算符,num >> 1,相当于num除以2
>>> : 无符号右移,忽略符号位,空位都以0补齐
下面将使用代码进行测试:这里涉及到码的表示:原码、反码、补码、移码
原码:最高位表示符号位,剩余位表示数字,0表示正数,1表示负数
反码:正数的反码等于原码,负数符号为不变,剩余位取反
补码:一个数如果为正,则它的原码、反码、补码相同;一个数如果为负,去到反码然后加1
移码:补码符号位取反
例如:表示10的这个数字(8位)
原码:0000 1010
反码:0000 1010
补码:0000 1010
移码:1000 1010
例如:表示数字 -10
原码:1000 1010
反码:1111 0101
补码:1111 0110
移码:0111 0110
例如:
public class MainTest {
//用于输出数字本身与其二进制数字 public static void printBinary(int num){ System.out.println(num); System.out.println(Integer.toBinaryString(num)); } public static void main(String[] args){ int num = -7774; //输出 num 的二进制位数 printBinary(num); //num 向右移动2位并输出 num =num >> 2; printBinary(num); //无符号右移 num =num>>>2; printBinary(num); } }
其结构如下:
-7774 11111111111111111110000110100010 -1944 11111111111111111111100001101000 1073741338 111111111111111111111000011010
这个数据市为了更明显的现实位移设计的,-7774向右移动2位,相当于处于4
当-7774 无符号向右移动2位,首位补0,会改变原值,结果实际如下,0系统会不显示
00111111111111111111111000011010
但是,当 - 7774 改为 7774 结果如何???
7774 1111001011110 1943 11110010111 485 111100101
最后无符号移动:负数与原值没有关系,正数符合除以 4 点特点
但是 发现右移运算符点结果:
负数:-1994
正数:1993