位运算和逻辑运算
1、原码补码反码
| 正数 | 负数 | |
|---|---|---|
| 原码 | 符号位为0 | 符号位为1 |
| 补码 | 原码 | 符号位不变,其他取反 |
| 反码 | 原码 | 补码+1 |
比如说:
5的原码: 00000000 00000000 00000000 00000101
-5的原码: 10000000 00000000 00000000 00000101
5的反码:00000000 00000000 00000000 00000101
-5的反码:11111111 11111111 11111111 11111010
5的补码:00000000 00000000 00000000 00000101
-5的补码:11111111 11111111 11111111 11111011
int i = 5;
int j = -5;
System.out.println(Integer.toBinaryString(i));
//101 之前的29位全0被忽略了
System.out.println(Integer.toBinaryString(j));
//11111111111111111111111111111011
2、位运算和逻辑运算
2.1、位运算
位运算是将数据先转化为二进制数补码形式,再逐位(bit)按规则计算
| 符号 | 描述 | 运算规则 |
|---|---|---|
| & | 按位与 | 两个位都为1时,结果才为1 |
| | | 按位或 | 两个位都为0时,结果才为0 |
| ^ | 按位异或 | 两个位相同为0,相异为1 |
| ~ | 按位非 | 0变1,1变0 |
| << | 左移 | 各二进位全部左移若干位,高位丢弃,低位补0 |
| >> | 右移 | 各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移) |
1、与(&) 全1则1,否则为0
2、或(|)全0则0,否则为1
3、异或(^) 相同为0,不同为1。
- 交换律
a ^ b = b ^ a - 结合律
(a ^ b) ^ c == a ^ (b ^ c) - 对于任何数x,都有
x ^ x = 0, x ^ 0 = x - 自反性
A ^ B ^ B = A ^ 0 = A --> A ^ B = C 则 C ^ B = A
4、取反 (!) 遇1则0,遇0则1
2.2、逻辑运算
逻辑运算符执行的是短路求值,当左边操作数可以推断出表达式的值,就不再执行 了
public static void main(String[] args) {
// 逻辑运算符执行的是短路求值,当左边操作数可以推断出表达式的值,就不再执行 了
int x, y = 10;
if (((x = 0) == 0) || ((y = 20) == 20)) {
System.out.println(y);// 输出10
}
// 位操作运算不管值是如何,任何参与运算的表达式都会被执行求值
int a, b = 10;
if (((a = 0) == 0) | ((b = 20) == 20)) {
System.out.println(b);// 输出20
}
}
1、逻辑与(&&)
全真则真
2、逻辑或(||)
全假则假
3、逻辑非(!)
真假互换
3、几个位运算操作
- 将x最右边的n位清零
x & (~0 << n) - 获取x的第n位的值(0或1)
(x >> n) & 1 - 仅将第n位置为1
x | (1 << n) - 仅将第n位置为0
x & (~(1 << n)) - 将x最高位到第n位(含)清零
x & ((1 << n) - 1) - 将第n位到第0位(含)清零
x & (~((1 << (n + 1)) - 1)) - 去除二进制 i 的最后一个1,该数一定比 i 小:
i & (i - 1)

浙公网安备 33010602011771号