关于位运算的认知

在计算机的世界中,一切数据皆为二进制.而二进制则是以位为单位,因此可以说位运算即使二进制的运算.

位运算的运算分量只能是整型或字符型数据.位运算把运算对象看作是由二进位组成的位串信息,按位完成指定的运算,得到位串信息的结果.

位运算的符号

  1. 按位与: &
  2. 按位或: |
  3. 按位异或: ^
  4. 按位取反: ~
  5. 左移: <<
  6. 右移: >> 将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补0

位运算符的优先级从高到低: 依次为: ~, &, ^, |.

其中,按位取反运算符是单目(一元)运算符,其余均为双目运算符.而且~的结合方向自右至左,且优先级高于算术运算符,其余运算符的结合方向都是自左至右,且优先级低于关系运算符.

按位与运算

按位与运算将两个运算分量的对应位按位遵照以下规则进行计算:

  0 & 0 = 0
  0 & 1 = 0
  1 & 0 = 0
  1 & 1 = 1

即同为 1 的位,结果为 1;否则结果为 0 .

按位或运算

按位或运算将两个运算分量的对应位按位遵照以下规则进行计算:

  0 | 0 = 0
  0 | 1 = 1
  1 | 0 = 1
  1 | 1 = 1

即只要有1个是1的位,结果为1,否则为0.

按位异或运算

按位异或运算将两个运算分量的对应位按位遵照以下规则进行计算:

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

即相应位的值相同的,结果为 0,不相同的结果为 1.
可以方便的交换两个值.

#include <stdio.h> 
main() 
{ 
  int i=10; 
  int j=1; 
  i=i^j; 
  j=j^i; 
  i=i^j; 
  printf("i=%d, j=%d\n",i,j); 
  return 0
}

按位取反运算

按位取反运算是单目(一元)运算,用来求一个位串信息按位的反.

  char s = 1;
  printf("%x\n",~s); //fe, 1111 1110

即为0的位,结果是1;而为1的位,结果是0.

左移运算

左移用来将一个数的各二进制位全部左移N位,右补0.

右移运算

将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补0.