C에서 비트 비교
이 기사에서는 C에서 비트를 비교하는 방법에 대한 몇 가지 방법을 설명합니다.
C에서 비트 비교를 위해 비트 XOR 및 AND 연산을 사용하여 사용자 지정 함수 구현
일반적으로 비트 비교는 단일 비트 값에 액세스하고union
및struct
키워드를 사용하여 비트 필드를 구현하는 것과 같은 필요한 작업을 수행하는 것을 수반합니다. 그러나 비트 연산은 지정된 비트를 숫자로 비교하는보다 효율적인 방법을 제공합니다. 이 경우 32 비트 너비를 보장하는u_int32_t
유형에 적합한 별도의 함수를 구현합니다.
예제 프로그램은 명령 줄 인수로 세 개의 정수를 취하며, 그중 처음 두 개는 비교되는 숫자이고 세 번째 정수는 n 번째 비트를 지정합니다. strtol
을 사용하여argv
요소를 변환하므로u_int32_t
유형으로 반환 값을 저장할 때 일부 정밀도가 손실됩니다. compareBits
함수는 중간 값을 저장하는 두 개의 지역 변수 인mask
및tmp
를 선언합니다. 1
을n-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!
예를 들어, 정수1234
및1231
은 각각00000000000000000000010011010010
및00000000000000000000010011001111
로 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!
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