位运算

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"

 

posted @ 2022-02-24 09:53  gabin  阅读(60)  评论(0编辑  收藏  举报