位运算

1.位运算概览

符号 描述 运算规则
& 都为1结果为1
| 都为零结果为0
~ 零一取反
^ 异或 不同为1,相同为0
<< 左移 各二进制位全部左移若干位,高位丢弃,低位补零
>> 右移 各二进制位全部右移若干位,对无符号数,高位补0;对有符号数,不同编译器处理的方法不同,有的是高位补符号位(算术右移);有的是高位补0(逻辑右移)

2.按位与运算符(&)

定义:参加运算的两个数据,按二进制位进行与运算,运算规律如下:

0&0=0 0&1=0 1&0=0 1&1=1
注意:负数按补码的形式参与运算

与运算的用途

  1. 清零
    如果想将一个数的二进制位置零,将对应二进制位与0进行按位与运算
  2. 取一个数的指定位
    比如,想要取X = 0010 1100的低四位,则将其和数0000 1111进行按位与运算。
  3. 判断奇偶
    可以根据二进制数的最后一位是0还是1来判断,对于正数来说补码与原码相同,如果最后一位是0,则为偶数,如果最后一位是1,则为奇数;对于负数来说,先求其原码,即将补码按位取反再加一,不难发现补码和原码的二进制末位一定相同,故末位若为1,则为奇数,若末位为0,则为偶数
    故下面的两个条件判断语句都可以实现奇偶数的判断:
    // == !=运算符的优先级高于&
    if((a & 1) == 0)
    if(a % 2 == 0)

3.按位或运算(|)

定义:有1则为1,全0则为0

或运算的用途

常用来给二进制数的某一位置1

4.异或运算(^)

定义:参与运算的二进制数按位异或,运算规则如下:

0^0=0 0^1=1 1^0=1 1^1=0

异或的常用性质

  1. x^x=0 x^0=x x^1=~x(~是取反)
  2. 自反性:a^b^b=a^0=0

异或运算用途

  1. 翻转指定位:
    将对应位与1异或,即可翻转指定二进制位
  2. 啥也不干
    将其与0异或即可
  3. 交换两个数的取值
    void Swap(int a* int b*)
    {
    if(a != b)
    {
    a^=b;
    b^=a;
    a^=b;
    }
    }

5.取反运算符(~)

取反运算符的用途

  1. 将数的最末位置0
    a & ~1

6.左移(<<)右移(>>)运算符

每左移一位,相当于该数乘2,每右移一位,相当于操作数除2

7.不同长度运算符进行位运算的说明

不同长度的数据进行位运算时,系统会首先将两个数按右端对其,然后进行位运算。
左边不足的位依照以下三种情况补足:

  1. 数据为正数,左边补0
  2. 数据为负数,左边补1
  3. 数据为无符号数,左边也补0