位操作符有 & 、| 、^,使用位操作符计算的过程就称为位运算过程。如果我们要将两个整型按位与(如3 & -2),这个时候应该如何计算??
常量是以补码的形式在内存中存储的,位运算也是以补码的形式来进行的。
- 原生的二进制:直接按照原本的位操作规则计算
- 非原生的二进制:如整型、字符型。这类的需要先转换成补码,再按照位操作的规则计算
1、案例一:3 & -2
正整数:补码 = 反码 = 原码
负整数:
- 先转换成原码
- 原码除最高位符号位外,其余位置取反,此时变成反码
- 补码 = 反码 + 1
整数 3:补码 = 反码 = 原码 = 00000000 00000000 00000000 00000011
整数-2:原码 = 10000000 00000000 00000000 00000010
反码 = 11111111 11111111 11111111 11111101
补码 = 11111111 11111111 11111111 11111110
让整数 3 的补码与整数 -2 的补码按位与
00000000 00000000 00000000 00000011
11111111 11111111 11111111 11111110
最终结果:00000000 00000000 00000000 00000010
由于最高符号位为0,说明是正整数,正整数的原码 = 补码,因此如果我们打印 3 & -2的话,打印的是原码,即 -2
2、案例二:~0
~ 操作符的作用:将一个数的二进制序列按位取反(这里的二进制序列指的是补码)
0 :原码 = 补码 = 00000000 00000000 00000000 00000000
~0:11111111 11111111 11111111 11111111(补码)
打印出来需要转换成原码,最高位的符号位为1,说明属于负整数类型
- 先转换成反码:反码 = 补码 - 1 = 11111111 11111111 11111111 11111110
- 再转换成原码:10000000 00000000 00000000 00000001(除符号位外,其余位置取反)
因此 最后得到得结果是 -1