一、原码 & 反码 & 补码
1. 正数的原码、反码、补码一致;
2. 负数的反码 = 符号位不变,其他位取反;
3. 负数的补码 = 负数的反码 + 1;
4. 0 的反码、补码都是0;
二、位运算:
1. a ^ 0 = a;
2. a^ a = 0; 相同的数异或为零,通过异或可以得到两个数相同位上不同值则为1,同值则为0。
3. n^ (n-1) = 0, 表示n是偶数;
4. a & (~b) = a-b; 一个数与另一个数的反相与,相当于这两个数相减;
5. a & b ; 用于判断b是否存在于a中;
三、位运算符的运算律
1. 交换律: A & B = B & A; A^B = B^A
2. 结合律:(A & B)& C = A & (B & C)
3. 等幂律:A & A = A; A & 0 = 0;
4. 互补律:A & ~A = 0; A | ~A = -1;
5. 同一律: A | 0 =A, A ^ 0 = A.
四、位运算的高级操作
1. 把右数的第k位变为1:x | 1<< (k-1);
2. 取右数的第k位: x >> (k-1) & 1;
3. 将 末k位全变为1 : x | (1 << k-1);
例题:求c 满足 a&c=b&c,且让 c 尽可能地大 ( 0<a,b,c <=2^63).
分析:尽可能的大,就是在c的每一位上尽可能地取1,所以a和b相同位上都取1即可;
long long a,b,c,d;
d = (a ^ b );
c = pow (2, 63);
c = c ^ d;
位运算交换两个整数:
void swap(int &a,int &b){
a ^= b;
b ^= a;
a ^= b;
}
分析:
a = a ^ b, 则:b = b ^ ( a ^ b) ==> b = b ^ b ^ a = 0 ^ a = a;
同理:a = (a ^ b) ^ a = 0 ^ b =b.