【位运算】总结
1. 前言
对于计算机而言,无论用什么语言编写的程序,最终都要转化为二进制进行运算
因为硬件的支持,PC的二进制运算速度比十进制的运算快的多,因此把普通变量的运算用位运算的方式实现,能极大的提升程序性能
2. 位运算
位运算一共有6种:与( & )、或( | )、非( ~ )、异或( ^ )、左移( << )、右移( >> )
2.1 使用场景
2.1.1 与运算
运算规则(同1为1):
0&0=0 0&1=0 1&0=0 1&1=1
1. 清零:使二进制为全部为0,即为 n & 0 = 0
2. 取二进制数的指定位数:例如取X = 1011,0110低四位,即为 X & 0000,1111,即可得到X的低四位
3. 判断奇偶:末位为1是奇数,末位为0是偶数,即为 n &1 == 0 ,可以代替 n % 2 == 0 来判断奇偶
4. 获取最低位的1,n & -n 例如 0011,1101 & 1100,0011 = 0000,0001,可以获取到最低位的1
2.1.2 或运算
运算规则(有1为1): 0|0=0 0|1=1 1|0=1 1|1=1
设置一个数的某些位为1,例如取X = 1011,0110 设置低低四位为1,即为 X | 0000,1111 ,可以得到1011,1111
2.1.3 异或运算
运算规则(相异为1): 0^0=0 0^1=1 1^0=1 1^1=0
异或满足以下几点性质
1. 交换律:A^B = B^A
2. 结合律:(A^B)^C = A^(B^C)
3. A^0 = A,A^A = 0
4. 自反性,A^B^A = B^0 = B
使用场景:
1. 翻转指定位,例如取X = 1011,0110 反转低四位,即为 X^0000,1111,可以得到 1011,1001
2. 交换两个数,
void Swap(int &a, int &b){
if (a != b){
a ^= b;
b ^= a;
a ^= b;
}
}
2.1.4 取反运算
运算规则(取反):
~1=0
~0=1
设置使一个数的最低位为零,即为 n & ~1,~1的值为1111 1111 1111 1110,再按"与"运算,最低位一定为0,“ ~”运算符的优先级比算术运算符、关系运算符、逻辑运算符和其他运算符都高