Saturday, June 16, 2007
C언어 비트 연산] 특정 비트 읽기, 1비트씩 추출; Get a Bit, Read a Bit
부호없는 16비트 정수 즉 "unsigned short"형의 숫자에서, 특정 비트가 1인지 0인지를 알아내는 방법입니다. 다음의 getAbit(숫자, 몇번째비트) 함수를 사용하면 0또는 1을 반환합니다. C에는 2진수 출력 기능이 없기에, ushortToBinary() 라는 함수도 만들었습니다.
소스 파일명: example.cpp
▶▶ C언어 비트 연산] 특정 비트 켜기 끄기 함수, Bit ON OFF; Set a Bit, Save a Bit
n번째 비트, 1인지 0인지 여부 판단 함수 예제
소스 파일명: example.cpp
#include <stdio.h>
int getAbit(unsigned short x, int n);
char *ushortToBinary(unsigned short i);
int main(void) {
unsigned short num = 24761;
printf("%s\n", ushortToBinary(num)); // 2진수로 출력
// 출력 결과: 0110000010111001
// 0번 비트 (맨 우측 비트) 읽기
printf("%d\n", getAbit(num, 0));
// 1
// 1번 비트 (맨 우측에서 2번째 비트) 읽기
printf("%d\n", getAbit(num, 1));
// 0
// num을 1비트씩 읽어, 2진수로 출력하기
printf("\n[ ");
for (int i = 15; i >= 0; i--) {
printf("%d", getAbit(num, i));
}
printf(" ]\n");
// [ 0110000010111001 ]
return 0;
}
// 지정한 정수에서, 몇번째 비트만 읽어서 반환하는 함수
int getAbit(unsigned short x, int n) { // getbit()
return (x & (1 << n)) >> n;
}
// 16비트 정수를 2진수 문자열로 변환 함수
char *ushortToBinary(unsigned short i) {
static char s[16 + 1] = { '0', };
int count = 16;
do { s[--count] = '0' + (char) (i & 1);
i = i >> 1;
} while (count);
return s;
}
int getAbit(unsigned short x, int n);
char *ushortToBinary(unsigned short i);
int main(void) {
unsigned short num = 24761;
printf("%s\n", ushortToBinary(num)); // 2진수로 출력
// 출력 결과: 0110000010111001
// 0번 비트 (맨 우측 비트) 읽기
printf("%d\n", getAbit(num, 0));
// 1
// 1번 비트 (맨 우측에서 2번째 비트) 읽기
printf("%d\n", getAbit(num, 1));
// 0
// num을 1비트씩 읽어, 2진수로 출력하기
printf("\n[ ");
for (int i = 15; i >= 0; i--) {
printf("%d", getAbit(num, i));
}
printf(" ]\n");
// [ 0110000010111001 ]
return 0;
}
// 지정한 정수에서, 몇번째 비트만 읽어서 반환하는 함수
int getAbit(unsigned short x, int n) { // getbit()
return (x & (1 << n)) >> n;
}
// 16비트 정수를 2진수 문자열로 변환 함수
char *ushortToBinary(unsigned short i) {
static char s[16 + 1] = { '0', };
int count = 16;
do { s[--count] = '0' + (char) (i & 1);
i = i >> 1;
} while (count);
return s;
}
▶▶ C언어 비트 연산] 특정 비트 켜기 끄기 함수, Bit ON OFF; Set a Bit, Save a Bit
tag: cpp
C언어 | C/C++ (Visual C++)
저 코드 실행되지가 않는데요..?
#incloud 에 뭔가 추가해야 될거 같은데...
위의 소스는
Visual C++ 2005 Express SP1 (32bit) + Microsoft Platform SDK
로 작성된 것입니다.
아주 간단한 소스이기에 어떤 컴파일러에서도 잘 작동되어야 하는데, 이상하군요.
위의 C소스에서 사용된 'C 표준 라이브러리 함수'는 printf() 하나뿐이기 때문에 #include 는 printf() 함수가 정의된 stdio.h 로 충분합니다.
#incloud 라고 쓰시면 오타이니까 당연히 에러가 나구요
#include 라고 써 보세요.
<< Home