C 言語でのビットの比較

胡金庫 2023年10月12日
C 言語でのビットの比較

この記事では、C のビットを比較する方法のいくつかの方法について説明します。

C 言語でのビット比較のためにビット単位の XOR および AND 演算を使用してカスタム関数を実装する

一般に、ビット比較では、単一のビット値にアクセスし、union および struct キーワードを使用してビットフィールドを実装するなど、必要な操作を実行する必要があります。ただし、ビット演算は、指定されたビットを数値で比較するためのより効率的な方法を提供します。この場合、32 ビット幅が保証されている u_int32_t タイプに適した別の関数を実装します。

サンプルプログラムは、コマンドライン引数として 3つの整数を取り、最初の 2つは比較される数値であり、3 番目の整数は n 番目のビットを指定します。strtol を使用して argv 要素を変換するため、戻り値を u_int32_t タイプに格納する際の精度が低下することに注意してください。compareBits 関数は、中間値を格納する 2つのローカル変数 masktmp を宣言します。1nth - 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 は、それぞれ 0000000000000000000001001101001000000000000000000000010011001111 としてバイナリで表されます。したがって、これら 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!
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook