Sunday, June 17, 2007
C언어 비트 연산] 특정 비트 켜기 끄기 함수, Bit ON OFF; Set a Bit, Save a Bit
부호없는 16비트 정수 즉 "unsigned short"형 숫자에서 특정 비트를 켜고 끄는 방법입니다. 아래의 "setAbit(숫자, 몇번째비트, 1또는0)" 함수를 사용하면 됩니다. 특정 비트를 1또는 0으로 설정한 후, 그 결과를 다시 "unsigned short"으로 반환합니다. 따라서 이 함수로, 어떤 숫자를 비트 단위로 조작할 수 있습니다.
소스 파일명: example.cpp
컴파일 및 실행 결과 화면:
위와는 반대로, 특정 비트가 켜져 있는지 아닌지 알아내기: ▶▶ C언어 비트 연산] 특정 비트 읽기, 1비트씩 추출; Get a Bit, Read a Bit
특정 비트 조작, 1 또는 0으로
소스 파일명: example.cpp
#include <stdio.h>
unsigned short setAbit(unsigned short x, int n, int b);
char *ushortToBinary(unsigned short i);
int main(void) {
unsigned short num = 0;
printf("%s\n", ushortToBinary(num));
// 2진수 출력 결과: 0000000000000000
// 0번 비트 (맨 우측 비트)를 1로 켜기
printf("%s\n", ushortToBinary( setAbit(num, 0, 1) ));
// 0000000000000001
printf("\n\n");
// 0000000000000000 에서, 차례로 1비트씩 켜기 (1로 ON)
num = 0;
for (int i = 15; i >= 0; i--) {
unsigned short temp = setAbit(num, i, 1);
printf("%s = %10u\n", ushortToBinary(temp), temp);
}
printf("\n\n");
// 1111111111111111 에서, 차례로 1비트씩 끄기 (0으로 OFF)
num = 0xFFFF;
for (int i = 15; i >= 0; i--) {
unsigned short temp = setAbit(num, i, 0);
printf("%s = %10u\n", ushortToBinary(temp), temp);
}
return 0;
}
// 정수 x 의 n번째 비트를, b로 설정하는 함수
unsigned short setAbit(unsigned short x, int n, int b) { // setbit()
if (b == 1)
return (unsigned short) (
x | (1 << n)
);
return (unsigned short) (
x & (~(1 << 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;
}
unsigned short setAbit(unsigned short x, int n, int b);
char *ushortToBinary(unsigned short i);
int main(void) {
unsigned short num = 0;
printf("%s\n", ushortToBinary(num));
// 2진수 출력 결과: 0000000000000000
// 0번 비트 (맨 우측 비트)를 1로 켜기
printf("%s\n", ushortToBinary( setAbit(num, 0, 1) ));
// 0000000000000001
printf("\n\n");
// 0000000000000000 에서, 차례로 1비트씩 켜기 (1로 ON)
num = 0;
for (int i = 15; i >= 0; i--) {
unsigned short temp = setAbit(num, i, 1);
printf("%s = %10u\n", ushortToBinary(temp), temp);
}
printf("\n\n");
// 1111111111111111 에서, 차례로 1비트씩 끄기 (0으로 OFF)
num = 0xFFFF;
for (int i = 15; i >= 0; i--) {
unsigned short temp = setAbit(num, i, 0);
printf("%s = %10u\n", ushortToBinary(temp), temp);
}
return 0;
}
// 정수 x 의 n번째 비트를, b로 설정하는 함수
unsigned short setAbit(unsigned short x, int n, int b) { // setbit()
if (b == 1)
return (unsigned short) (
x | (1 << n)
);
return (unsigned short) (
x & (~(1 << 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;
}
컴파일 및 실행 결과 화면:
D:\Z>cl example.cpp && example.exe
example.cpp
0000000000000000
0000000000000001
1000000000000000 = 32768
0100000000000000 = 16384
0010000000000000 = 8192
0001000000000000 = 4096
0000100000000000 = 2048
0000010000000000 = 1024
0000001000000000 = 512
0000000100000000 = 256
0000000010000000 = 128
0000000001000000 = 64
0000000000100000 = 32
0000000000010000 = 16
0000000000001000 = 8
0000000000000100 = 4
0000000000000010 = 2
0000000000000001 = 1
0111111111111111 = 32767
1011111111111111 = 49151
1101111111111111 = 57343
1110111111111111 = 61439
1111011111111111 = 63487
1111101111111111 = 64511
1111110111111111 = 65023
1111111011111111 = 65279
1111111101111111 = 65407
1111111110111111 = 65471
1111111111011111 = 65503
1111111111101111 = 65519
1111111111110111 = 65527
1111111111111011 = 65531
1111111111111101 = 65533
1111111111111110 = 65534
D:\Z>
example.cpp
0000000000000000
0000000000000001
1000000000000000 = 32768
0100000000000000 = 16384
0010000000000000 = 8192
0001000000000000 = 4096
0000100000000000 = 2048
0000010000000000 = 1024
0000001000000000 = 512
0000000100000000 = 256
0000000010000000 = 128
0000000001000000 = 64
0000000000100000 = 32
0000000000010000 = 16
0000000000001000 = 8
0000000000000100 = 4
0000000000000010 = 2
0000000000000001 = 1
0111111111111111 = 32767
1011111111111111 = 49151
1101111111111111 = 57343
1110111111111111 = 61439
1111011111111111 = 63487
1111101111111111 = 64511
1111110111111111 = 65023
1111111011111111 = 65279
1111111101111111 = 65407
1111111110111111 = 65471
1111111111011111 = 65503
1111111111101111 = 65519
1111111111110111 = 65527
1111111111111011 = 65531
1111111111111101 = 65533
1111111111111110 = 65534
D:\Z>
위와는 반대로, 특정 비트가 켜져 있는지 아닌지 알아내기: ▶▶ C언어 비트 연산] 특정 비트 읽기, 1비트씩 추출; Get a Bit, Read a Bit
tag: cpp
C언어 | C/C++ (Visual C++)
<< Home