C 語言中的位比較

Jinku Hu 2023年10月12日
C 語言中的位比較

本文將介紹幾種比較 C 語言中位的方法。

在 C 語言中使用按位 XOR 和 AND 操作實現按位比較的自定義函式

通常,位比較需要訪問單個位值並進行所需的操作,例如使用 unionstruct 關鍵字實現位欄位。但是,按位運算提供了一種比較數字中指定位的更有效方法。在這種情況下,我們將實現一個適用於 u_int32_t 型別的單獨函式,該函式必須具有 32 位寬度。

示例程式將三個整數用作命令列引數,其中前兩個是要比較的數字,而第三個整數指定第 n 位。注意,我們使用 strtol 轉換 argv 元素,因此在以 u_int32_t 型別儲存返回值時會損失一些精度。compareBits 函式宣告兩個儲存中間值的區域性變數-masktmp。我們通過將 1 向左移動 nth - 1 個位置來設定掩碼中的第 n 個位。然後,對兩個使用者輸入數字進行 XOR 運算,以得到每個位置的位差,並在結果中表示不同的值。最後,我們需要從第 n 個位置提取該位,並檢查該值是否為 0

#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

bool compareBits(u_int32_t n1, u_int32_t n2, u_int32_t nth) {
  u_int32_t mask, tmp;

  mask = 1 << (nth - 1);
  tmp = n1 ^ n2;

  if ((tmp & mask) == 0)
    return true;
  else
    return false;
}

int main(int argc, char *argv[]) {
  u_int32_t num1, num2, bit;

  if (argc != 4) {
    fprintf(stderr, "Usage: %s integer1 integer2 nth_bit \n", argv[0]);
    exit(EXIT_FAILURE);
  }

  num1 = strtol(argv[1], NULL, 0);
  num2 = strtol(argv[2], NULL, 0);
  bit = strtol(argv[3], NULL, 0);

  compareBits(num1, num2, bit) ? printf("bits equal!\n")
                               : printf("bits not equal!\n");

  exit(EXIT_SUCCESS);
}

樣本檔案格式:

./program 1234 1231 1

輸入檔案格式:

bits not equal!

例如,整數 12341231 分別用二進位制表示為 0000000000000000000001001001101001000000000000000000000010011001111。因此,對這兩個值進行 XOR 運算得到二進位制表示形式 00000000000000000000000000011101,最後將其與掩碼 0000000000000000000000000000001010 進行 AND 運算以提取單個位的位置值。如果結果全為零,則表示比較的位相等;否則,結果相反。

但是,我們也可以縮短 compareBits 函式,並將 XOR/AND 操作移至 return 語句,如以下示例程式碼所示。注意,該函式返回與按位 XOR/AND 運算相反的邏輯,因為我們在呼叫函式中使用 ? :三元語句輸出相應的訊息。

#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

bool compareBits(u_int32_t n1, u_int32_t n2, u_int32_t nth) {
  u_int32_t mask;

  mask = 1 << (nth - 1);

  return !((n1 ^ n2) & mask);
}

int main(int argc, char *argv[]) {
  u_int32_t num1, num2, bit;

  if (argc != 4) {
    fprintf(stderr, "Usage: %s integer1 integer2 nth_bit \n", argv[0]);
    exit(EXIT_FAILURE);
  }

  num1 = strtol(argv[1], NULL, 0);
  num2 = strtol(argv[2], NULL, 0);
  bit = strtol(argv[3], NULL, 0);

  compareBits(num1, num2, bit) ? printf("bits equal!\n")
                               : printf("bits not equal!\n");

  exit(EXIT_SUCCESS);
}

示例檔案格式:

./program 1234 1231 2

輸入檔案格式:

bits equal!
作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 創辦人。Jinku 在機器人和汽車行業工作了8多年。他在自動測試、遠端測試及從耐久性測試中創建報告時磨練了自己的程式設計技能。他擁有電氣/ 電子工程背景,但他也擴展了自己的興趣到嵌入式電子、嵌入式程式設計以及前端和後端程式設計。

LinkedIn Facebook