C에서 비트 비교

Jinku Hu 2023년10월12일
C에서 비트 비교

이 기사에서는 C에서 비트를 비교하는 방법에 대한 몇 가지 방법을 설명합니다.

C에서 비트 비교를 위해 비트 XOR 및 AND 연산을 사용하여 사용자 지정 함수 구현

일반적으로 비트 비교는 단일 비트 값에 액세스하고unionstruct키워드를 사용하여 비트 필드를 구현하는 것과 같은 필요한 작업을 수행하는 것을 수반합니다. 그러나 비트 연산은 지정된 비트를 숫자로 비교하는보다 효율적인 방법을 제공합니다. 이 경우 32 비트 너비를 보장하는u_int32_t유형에 적합한 별도의 함수를 구현합니다.

예제 프로그램은 명령 줄 인수로 세 개의 정수를 취하며, 그중 처음 두 개는 비교되는 숫자이고 세 번째 정수는 n 번째 비트를 지정합니다. strtol을 사용하여argv요소를 변환하므로u_int32_t유형으로 반환 값을 저장할 때 일부 정밀도가 손실됩니다. compareBits함수는 중간 값을 저장하는 두 개의 지역 변수 인masktmp를 선언합니다. 1n-1위치만큼 왼쪽으로 이동하여mask에서 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-ing하면00000000000000000000000000011101이진 표현이되며, 마지막으로 마스크00000000000000000000000000000010을 AND로 처리하여 단일 비트 위치 값을 추출합니다. 결과가 모두 0이면 비교 된 비트가 동일 함을 의미합니다. 그렇지 않으면 반대입니다.

그러나 다음 예제 코드와 같이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

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 Facebook