按位運算子

按位運算子可用於對變數執行位級操作。
下面是 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 */
    }
}