位运算
# 位运算
| 符号 | 描述 | 运算规则 |
|---|---|---|
| & | 与 | 两个位都为 1 时,结果才为 1 |
| | | 或 | 两个位都为 0 时,结果才为 0 |
| ^ | 异或 | 两个位相同为 0,相异为 1 |
| ~ | 取反 | 0 变 1,1 变 0 |
| << | 左移 | 各二进位全部左移若干位,高位丢弃,低位补 0 |
| >> | 右移 | 各二进位全部右移若干位,对无符号数,高位补 0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补 0(逻辑右移),Java 中为算术右移根据符合位来补(如为负数则补 1,正数补 0) |
| >>> | 逻辑右移 | 各二进位全部右移若干位,对无符号数,高位补 0,有符号数 |
# 原码
原码就是符号位加上真值 以下以 8 位来实例
+1的原码为
0000 0001
-1的原码为
1000 0001
1
2
3
4
2
3
4
# 反码
正数的反码是其本身
负数的反码是在其原码的基础上,符号位不变,其余各个位取反
+1的反码为
0000 0001
-1的反码为
1111 1110
1
2
3
4
2
3
4
# 补码
通常一个数的二进制是以补码的形式展现
- 正数的补码就是其本身
- 负数的补码是在其原码的基础上,符号位不变,其余各位取反,最后 + 1. (即在反码的基础上 + 1)
+1的补码为
0000 0001
-1的补码为
1111 1111
1
2
3
4
2
3
4
# 负数的最小值取负为多少
即负数的最小值 取反 再 + 1
public static void main(String[] args) {
int c = Integer.MIN_VALUE;
int d = -c;
int e = ~c + 1;
System.out.println(c); //-2147483648
System.out.println(d); //-2147483648
System.out.println(e); //-2147483648
c = 0;
d = -c;
e = ~c + 1;
System.out.println(c); //0
System.out.println(d); //0
System.out.println(e); //0
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 打印二进制
public static void print(int num) {
for (int i = 31; i >=0; i--) {
//把1左移n位 和原数做与运算 两者为1时输出1否则输出
System.out.print((num & (1 << i)) == 0 ? "0" : "1");
}
System.out.println();
}
1
2
3
4
5
6
7
2
3
4
5
6
7
编辑 (opens new window)
上次更新: 2023/12/06, 01:31:48