Java位移运算符功能详解
目录
准备工作
- 计算机基础知识:数字在内存中实际以二进制补码存在
- 位移操作符实际操作的就是补码,不是在原码上移动
- 正数的原码、反码、补码相同,负数则按下面步骤计算出补码。
- Java中数字都有符号,左边第一位就是符号位,1表示负数,0表示非负数
- 以二进制原码形式打印数字:Integer.toString(num,2),num为要打印的十进制Int数字,2表示二进制
- 以二进制补码打印数字:Integer.toBinaryString(num)
- 原码:数字的二进制表示码(十进制转二进制手动计算:把十进制数连续对2取余直到商为0,把余数倒序排列就是要求的二进制)
- 反码:最左边符号位不变,剩下所有位取反,0变1,1变0
- 补码:反码加 1
开始解析
1、<< 左移(不存在<<<)
测试代码如下:cf()方法是我自定义的将int转换成二进制补码并格式化的方法,完整原码在最后
// 左移
static void leftMove(){
System.out.println("int最小值补码 = " + cf(Integer.MIN_VALUE));
System.out.println("int最大值补码 = " + cf(Integer.MAX_VALUE));
int num = -129;
String binary = bf(num); // 原码
String complement = cf(num); // 补码
System.out.println(num + " 原码 " + binary);
System.out.println(num + " 补码 " + complement);
System.out.println("---------------------------------------------");
System.out.println(complement + " << 0 补码 = " + cf(num<<0) +" ,十进制 "+ (num<<0));
System.out.println(complement + " << 32 补码 = " + cf(num<<32) +" ,十进制 "+ (num<<32));
System.out.println(complement + " << 4 补码 = " + cf(num<<4) +" ,十进制 "+ (num<<4));
System.out.println(complement + " << 36 补码 = " + cf(num<<36) +" ,十进制 "+ (num<<36));
System.out.println(complement + " << 24 补码 = " + cf(num<<24) +" ,十进制 "+ (num<<24));
System.out.println(complement + " << 31 补码 = " + cf(num<<31) +" ,十进制 "+ (num<<31));
}
打印结果如下:
int最小值补码 = 1000_0000_0000_0000_0000_0000_0000_0000
int最大值补码 = 0111_1111_1111_1111_1111_1111_1111_1111
-129 原码 1000_0000_0000_0000_0000_0000_1000_0001
-129 补码 1111_1111_1111_1111_1111_1111_0111_1111
---------------------------------------------
1111_1111_1111_1111_1111_1111_0111_1111 << 0 补码 = 1111_1111_1111_1111_1111_1111_0111_1111 ,十进制 -129
1111_1111_1111_1111_1111_1111_0111_1111 << 32 补码 = 1111_1111_1111_1111_1111_1111_0111_1111 ,十进制 -129
1111_1111_1111_1111_1111_1111_0111_1111 << 4 补码 = 1111_1111_1111_1111_1111_0111_1111_0000 ,十进制 -2064
1111_1111_1111_1111_1111_1111_0111_1111 << 36 补码 = 1111_1111_1111_1111_1111_0111_1111_0000 ,十进制 -2064
1111_1111_1111_1111_1111_1111_0111_1111 << 24 补码 = 0111_1111_0000_0000_0000_0000_0000_0000 十2130706432
1111_1111_1111_1111_1111_1111_0111_1111 << 31 补码 = 1000_0000_0000_0000_0000_0000_0000_0000 十-2147483648
三种颜色数字含义:
- 蓝色: