按位运算符

按位运算符可用于对变量执行位级操作。
下面是 C 中支持的所有六个按位运算符的列表:

符号 操作者
& 按位 AND
` `
^ 按位异或(异或)
~ 按位不(一个补码)
<< 合乎逻辑的左移
>> 逻辑右移

以下程序说明了所有按位运算符的使用:

#include <stdio.h>

int main(void)
{
   unsigned int a = 29;    /* 29 = 0001 1101 */  
   unsigned int b = 48;    /* 48 = 0011 0000 */
   int c = 0;           

   c = a & b;              /* 32 = 0001 0000 */ 
   printf("%d & %d = %d\n", a, b, c );

   c = a | b;              /* 61 = 0011 1101 */
   printf("%d | %d = %d\n", a, b, c );

   c = a ^ b;              /* 45 = 0010 1101 */
   printf("%d ^ %d = %d\n", a, b, c );

   c = ~a;                 /* -30 = 1110 0010 */
   printf("~%d = %d\n", a, c );

   c = a << 2;             /* 116 = 0111 0100 */
   printf("%d << 2 = %d\n", a, c );

   c = a >> 2;             /* 7 = 0000 0111 */
   printf("%d >> 2 = %d\n", a, c );

   return 0;
}

应避免使用带符号类型的按位运算,因为这种位表示的符号位具有特定含义。特殊限制适用于班次运算符:

  • 将 1 位左移入有符号位是错误的,并导致未定义的行为。

  • 右移一个负值(符号位 1)是实现定义的,因此不可移植。

  • 如果移位运算符的右操作数的值为负或大于或等于提升的左操作数的宽度,则行为未定义。

掩码:

掩码是指通过使用逻辑按位运算从变量中提取所需位(或变换所需位)的过程。用于执行屏蔽的操作数(常量或变量)称为掩码

掩码用于许多不同的方式:

  • 确定整数变量的位模式。
  • 将给定位模式的一部分复制到新变量,而新变量的其余部分用 0 填充(使用按位 AND)
  • 将给定位模式的一部分复制到新变量,而新变量的其余部分用 1 填充(使用按位 OR)。
  • 将给定位模式的一部分复制到新变量,而原始位模式的其余部分在新变量内反转(使用按位异或)。

以下函数使用掩码显示变量的位模式:

#include <limits.h>
void bit_pattern(int u)
{
    int i, x, word;
    unsigned mask = 1;
    word = CHAR_BIT * sizeof(int);
    mask = mask << (word - 1);    /* shift 1 to the leftmost position */
    for(i = 1; i <= word; i++)
    {
        x = (u & mask) ? 1 : 0;  /* identify the bit */
        printf("%d", x);         /* print bit value */
        mask >>= 1;              /* shift mask to the right by 1 bit */
    }
}