1、位运算
1.1、二进制打印
private static void print(int num) { // 1 << i意味着只有第i位置上的是1,其他位都是0 // num & 一个只有i位置上是1的,除了这个位置上的,其他位都一定会变成0;那如果最终都是0,则表示这个位置上是没有占位的,而不是0,则表示有占位 for (int i = 31; i >= 0; i--) { System.out.print((num & (1 << i)) == 0 ? "0" : "1"); } System.out.println( "\n" + num); }
1.2、反码
1.2.1 正数:原码
1.2.2 负数:符号位除外,其他位置取反
1.3、补码
1.3.1、正数:原码
1.3.2、负数:反码+1
1.3.3、 取反后+1,得出相反数。无论正数还是负数
1.4、证明算数运算并非我们理解的10进制运算
jshell> Integer.MAX_VALUE+1 $81 ==> -2147483648 jshell> Integer.MIN_VALUE-1 $82 ==> 2147483647
1.5 常见的位运算
1.5.1 &,按位与。同为1则1,否则0
1.5.2 | ,按位或。有一个1则1,否则0
1.5.3 ^ ,按位异或。有一个1则1,否则0
1.5.4 ~,按位取反(包含符号位)。
个人理解是就像是一个x轴的左右两边,右边代表正数(含0),左边代表负数。一一对应。0对-1,1对-2,2对-3,3对-4,4对-5,5对-6。相反数取值逻辑取反+1
jshell> ~5 $10 ==> -6 jshell> Integer.toBinaryString(-6) $11 ==> "11111111111111111111111111111010" jshell> Integer.toBinaryString(5) $12 ==> "101"