【位运算】总结

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,“ ~”运算符的优先级比算术运算符、关系运算符、逻辑运算符和其他运算符都高

 

posted @ 2021-02-05 23:12  __Helios  阅读(165)  评论(0编辑  收藏  举报