左移运算符(<<)
按二进制形式将运算符左边的运算对象向左移动运算符右侧指定的位数,高位移出(舍弃),低位的空位补0
-
正数
//将20转成二进制为 00010100 (短除法计算十进制转二进制) 这里只显示了8位,共32位二进制 //将二进制数向左移动两位,低位补零 01010000 //再将01010000转成十进制 为80 int i = 20; System.out.println(Integer.toBinaryString(i)); //10100 i <<= 2; System.out.println(Integer.toBinaryString(i)); //1010000 System.out.println(i); //80
-
负数
//将20转成二进制为 00010100 (前16位缺省0) //-20的二进制是20二进制的补码(原码->反码(取反)->补码(加1)) //取反:00010100 -> 11101011 , 加1:11101011 -> 11101100 (前16位缺省1) //将二进制数向左移动两位,低位补零 10110000 //再将10110000转成十进制,负数的二进制是补码,得到原码的步骤是:补码->反码(补码-1)->原码(反码取反) //反码(补码-1) 10110000 -> 10101111, 原码(反码取反): 10101111 -> 01010000 转成十进制前面加负号 -80 int i = -20; System.out.println(Integer.toBinaryString(i)); //11111111111111111111111111101100 i <<= 2; System.out.println(Integer.toBinaryString(i)); //11111111111111111111111110110000 System.out.println(i); //-80
右移运算符(>>)
按二进制形式将运算符左边的运算对象向右移动运算符右侧指定的位数,“有符号"右移位运算符使用了"符号扩展”:若值为正,则在高位插入0;若值为负,则在高位插入1,低位移出(舍弃)。
-
正数
//将20转成二进制为 00010100 //将二进制数向右移动两位,正数高位补0,00000101 //再将00000101转成十进制 为5 int i = 20; System.out.println(Integer.toBinaryString(i)); //110100 i >>= 2; System.out.println(Integer.toBinaryString(i)); //101 System.out.println(i); //5
-
负数
//将20转成二进制为 00010100 //-20的二进制为 11101100 //将二进制数向右移动两位,正数高位补1,11111011 //再将11111011转成十进制,负数的二进制是补码,得到原码的步骤是:补码->反码(补码-1)->原码(反码取反) //反码(补码-1) 11111011 -> 11111010, 原码(反码取反): 11111010 -> 00000101 转成十进制前面加负号 -5 int i = -20; System.out.println(Integer.toBinaryString(i)); //11111111111111111111111111101100 i >>= 2; System.out.println(Integer.toBinaryString(i)); //11111111111111111111111111111011 System.out.println(i); // -5
无符号右移运算符(>>>)
按二进制形式将运算符左边的运算对象向右移动运算符右侧指定的位数,“无符号"右移位运算符使用了"零扩展”:无论正负都在高位插入0,低位移出(舍弃)。对于正数来说和有符号右移(>>) 相同,都是再高位插入0,但是对于负数来说不同。
-
负数
因为负数的二进制最高位为1,而无符号右移要在最高位补0,所以要显示全32位二进制
//-20的二进制:11111111111111111111111111101100 //右移2位: 00111111111111111111111111111011 //二进制 00111111111111111111111111111011 转成十进制结果为1073741819 int i = -20; System.out.println(Integer.toBinaryString(i)); //11111111111111111111111111101100 i >>>= 2; System.out.println(Integer.toBinaryString(i)); //111111111111111111111111111011 System.out.println(i); // 1073741819