int형의 값의 범위는 –2,147,483,648 ~ 2,147,483,647입니다. 이렇게 큰 숫자를 저장할 수 있는 공간이죠. 하지만 우리는 int타입에 이렇게 큰 값을 잘 넣어서 사용하지는 않습니다. 그렇다면 그만큼의 공간이 낭비되는 셈입니다. 그렇다면 int형을 반으로 나눠서 사용할 수는 없을까요? 가능합니다. 비트 연산자의 간단한 기법을 통해서 말이죠. 이렇게 된다면 하나의 int값 안에 2개의 값을 넣을수가 있게 되겠죠.
참고로 이러한 방법들은 실제 코딩에서는 잘 사용되지 않습니다. 메모리를 타이트하게 잡고싶다면 __int8, __int16과 같은 변수타입을 선언해서 사용하면 됩니다.
비트 쪼개기 (Bit Split) 사용법 & 예제 (비트연산 활용)
#include <stdio.h>
int main() {
unsigned int num = 0;
unsigned int value = 0;
unsigned int temp = 0;
int location = 0;
for (;;) {
printf("location(1 ~ 2) : ");
scanf_s("%d", &location);
//위치 범위 예외
if (location < 1 || location > 2) {
printf("위치 범위를 초과하였습니다.\n\n");
continue;
}
location--;
printf("input Data (0 ~ 65535) : ");
scanf_s("%d", &value);
if (value < 0 || value > 65535) {
printf("값 범위를 초과하였습니다.\n\n");
continue;
}
//비트 입력
temp = 0xff << location * 16;
num = num & ~temp;
num = num | (value << (location) * 16);
for (int i = 0; i < 2; i++) {
printf("[%d]번째 비트의 값(10진수) : %d\n", i + 1, (num >> i * 16) & 0x0000FFFF);
}
printf("\n");
for (int i = 0; i < 32; i++) { //전체 비트 출력
int result = num >> i & 1;
printf("%d", result);
if ((i+1) % 16 == 0)printf(" ");
}
printf("\n\n");
}
}
'Language > C , C++ , C#' 카테고리의 다른 글
[C언어/C++] 이중 포인터 사용법 & 예제 (0) | 2021.01.31 |
---|---|
[C언어/C++] 포인터 배열, 배열 포인터의 사용법과 차이점 (3) | 2021.01.30 |
[C언어/C++] 비트 플래그 (Bit Flag) 사용법 & 예제 (비트연산 활용) (0) | 2021.01.29 |
[C언어/C++] 10진수를 2진수로 변환 출력하기 (비트연산 활용) (0) | 2021.01.28 |