位运算与二进制学习

需要了解二进制码,5 的 二进制码是 101, java 提供方法可以将十进制转换成二进制

将 5 转换成二进制

Integer.toUnsignedString(5, 2); 101

正数 符号位为0,负数符号数为1

负数在计算机内以补码显示 -5 的原码如下

10000000000000000000000000000101 原码

按位取反得到原码

11111111111111111111111111111010 反码

反码加1得到反码

11111111111111111111111111111011 补码

正数的原码与补码相同 

 5 的原码如下:

10000000000000000000000000000101 原码

01111111111111111111111111111010 反码

10000000000000000000000000000101 补码

左右(<<)右移(>>)就是将反码按对应的位运算向左(补0)或向右移动(补1或补0)

5 >> 1 结果 10000000000000000000000000000010

System.out.println(5>>1); //2
System.out.println(Integer.toUnsignedString(5>>1, 2)); //10(打印时符号位和0会被省略)
5 << 1 结果 10000000000000000000000000001010

System.out.println(5<<1); //10
System.out.println(Integer.toUnsignedString(5<<1, 2)); //1010


-5 >> 1 结果 

补码 11111111111111111111111111111101

转换成反码(补码 -1) 11111111111111111111111111111100

装换成原码 (除符号位安位取反)10000000000000000000000000000011  (-3)

System.out.println(Integer.toUnsignedString(-5, 2)); //11111111111111111111111111111011
System.out.println(-5>>1); //-3
System.out.println(Integer.toUnsignedString(-5>>1, 2));//11111111111111111111111111111101

-5 << 1 结果 

补码 11111111111111111111111111110110

转换成反码(补码 -1) 11111111111111111111111111110101()

装换成原码 (除符号位安位取反)10000000000000000000000000001010  (-10)

无符号右移预算符( >>>) 符号位也参与移动原位置将补0,这样就说明负数经过无符号右移后(>>>)将变为整数。

代码对比

System.out.println(Integer.toUnsignedString(-5, 2));//11111111111111111111111111111011
System.out.println(-5>>1);//-3
System.out.println(Integer.toUnsignedString(-5>>1, 2)); //11111111111111111111111111111101
System.out.println(-5>>>1);//2147483645
System.out.println(Integer.toUnsignedString(-5>>>1, 2));// 1111111111111111111111111111101(注意符号为 0 省略了)

猜你喜欢

转载自blog.csdn.net/ff_hh/article/details/80021982