用非(~)和与()表示亦或(^)
异或的真值表分析
x y | x^y 0 0 | 0 0 1 | 1 1 0 | 1 1 1 | 0
-
观察异或的特性:当x和y不同时为1时结果为1
-
用已有操作构造:我们只有 ~(非) 和 &(与)
-
关键洞察:
x ^ y = (x & ~y) | (~x & y)
-
x & ~y
:x为1且y为0的情况 -
~x & y
:x为0且y为1的情况 -
这两种情况的或就是异或
-
-
但题目不允许用 |,所以要用德摩根定律转换:
-
A | B = ~(~A & ~B)
-
完整推导
int bitXor(int x, int y) {// 步骤1:分别找出 x=1,y=0 和 x=0,y=1 的情况int part1 = x & ~y; // x为1且y为0int part2 = ~x & y; // x为0且y为1// 步骤2:用德摩根定律实现 OR 操作// part1 | part2 = ~(~part1 & ~part2)return ~(~part1 & ~part2); }
验证例子:bitXor(4, 5)
-
4 = 0100, 5 = 0101
-
part1 = 0100 & 1010 = 0000
-
part2 = 1011 & 0101 = 0001
-
~part1 = 1111, ~part2 = 1110
-
~part1 & ~part2 = 1110
-
~(1110) = 0001 = 1 ✓
tmin - 返回最小补码整数
补码表示原理
-
在32位补码中,最小整数是:0x80000000
-
二进制:1000 0000 0000 0000 0000 0000 0000 0000
-
十进制:-2,147,483,648
解题思路
最小补码整数的特点是:最高位为1,其他位为0
int tmin(void) {// 将1左移31位:000...001 → 100...000return 1 << 31; }
验证
-
1 << 31 = 0x80000000 = -2147483648 ✓
答案
int bitXor(int x, int y) {return ~(~(x & ~y) & ~(~x & y)); } int tmin(void) {return 1 << 31; }
重要概念总结
-
按位运算:直接操作整数的二进制位
-
德摩根定律:
~(A & B) = ~A | ~B
和~(A | B) = ~A & ~B
-
补码表示:最高位为符号位,最小负数只有符号位为1
-
移位操作:左移n位相当于乘以2^n