C 語言中的位比較
本文將介紹幾種比較 C 語言中位的方法。
在 C 語言中使用按位 XOR 和 AND 操作實現按位比較的自定義函式
通常,位比較需要訪問單個位值並進行所需的操作,例如使用 union
和 struct
關鍵字實現位欄位。但是,按位運算提供了一種比較數字中指定位的更有效方法。在這種情況下,我們將實現一個適用於 u_int32_t
型別的單獨函式,該函式必須具有 32 位寬度。
示例程式將三個整數用作命令列引數,其中前兩個是要比較的數字,而第三個整數指定第 n 位。注意,我們使用 strtol
轉換 argv
元素,因此在以 u_int32_t
型別儲存返回值時會損失一些精度。compareBits
函式宣告兩個儲存中間值的區域性變數-mask
和 tmp
。我們通過將 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!
例如,整數 1234
和 1231
分別用二進位制表示為 00000000000000000000010010011010010
和 00000000000000000000010011001111
。因此,對這兩個值進行 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!