C 語言中的位比較

Jinku Hu 2021年3月21日
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 <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdbool.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 <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdbool.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!
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn