Home 位运算学习笔记
Post
Cancel

位运算学习笔记

Java 二进制和位运算笔记

1) 二进制和位的概念 2) 正数怎么用二进制表达 3) 负数怎么用二进制表达 4) 打印二进制;直接定义二进制、十六进制的变量 5) 常见的位运算(1、&、^、~、«、»、»>) 6) 解释打印二进制的函数 7) 注意1、&是位运算或、位运算与;11、&&是逻辑或、逻辑与,两者是有区别的 8) 相反数 9) 整数最小值的特殊性(取绝对值还是自己) 10) 为什么这么设计二进制(为了加法的逻辑是一套逻辑,没有条件转移),那么为啥加法逻辑如此重要呢? 11) 关于溢出(自己确保自己的调用所得到的结果不会溢出,一定是自己确保的,计算机不会给你做检查) 12) 位运算玩法很多很多,特别是异或运算、如何用位运算实现加减乘除

1. 整数的二进制表示

Java 中所有整数在底层都是用 32 位二进制表示的,包括符号位:

1
2
3
4
5
6
public static void print(int num){
    for (int i = 31; i >= 0; i--) {
        System.out.print((num & (1 << i)) == 0 ? "0" : "1");
    }
    System.out.println();
}

示例:

1
2
int num = 8792878;
print(num); // 打印 num 的 32 位二进制表示

2. 移位操作

左移 <<

左移一位相当于乘 2:

1
2
int test = 1;
print(test << 1); // 输出:00000000...10

有符号右移 >>

保持符号位不变:

1
2
int a = Integer.MIN_VALUE;
print(a >> 1); // 补符号位

无符号右移 >>>

不保留符号位,总是补 0:

1
print(a >>> 1);

3. 最大值与最小值

1
2
int a = Integer.MAX_VALUE; // 2^31 - 1
int b = Integer.MIN_VALUE; // -2^31

负数的表示:符号位为 1,数值部分是对应正数取反加一(补码):

1
2
int b = 3875;
int c = ~b; // b 取反

4. 按位操作

1
2
3
print(x | y); // 按位或
print(x & y); // 按位与
print(x ^ y); // 按位异或

5. 补码和取反

负数 d 可以通过 ~c + 1 得到:

1
2
3
int c = 5;
int d = -c;
d = (~c + 1); // 手动求补码

输出:

1
2
5
-5
This post is licensed under CC BY 4.0 by the author.