C 言語でのビットの比較
この記事では、C のビットを比較する方法のいくつかの方法について説明します。
C 言語でのビット比較のためにビット単位の XOR および AND 演算を使用してカスタム関数を実装する
一般に、ビット比較では、単一のビット値にアクセスし、union
および struct
キーワードを使用してビットフィールドを実装するなど、必要な操作を実行する必要があります。ただし、ビット演算は、指定されたビットを数値で比較するためのより効率的な方法を提供します。この場合、32 ビット幅が保証されている u_int32_t
タイプに適した別の関数を実装します。
サンプルプログラムは、コマンドライン引数として 3つの整数を取り、最初の 2つは比較される数値であり、3 番目の整数は n 番目のビットを指定します。strtol
を使用して argv
要素を変換するため、戻り値を u_int32_t
タイプに格納する際の精度が低下することに注意してください。compareBits
関数は、中間値を格納する 2つのローカル変数 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
は、それぞれ 00000000000000000000010011010010
と 00000000000000000000010011001111
としてバイナリで表されます。したがって、これら 2つを XOR すると、00000000000000000000000000011101
バイナリ表現になり、最終的にマスク 00000000000000000000000000000010
と 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!