C :: 정수의 내부 비트를 살짝 엿보자.

2009/01/07 21:32

실수의 내부 비트를 알려면 짱구 좀 굴려야 하지만, 정수는 너무나 간단합니다. 쉽게 이진수를 구하는 것처럼 2로 나눠 가면서 구하는 방법도 있겠구요. 아니면, 제가 요즘 푹 빠져있는 비트 연산을 이용하는 방법도 있습니다. 전 비트 연산을 좋아하니까 이걸로 엿보겠습니다.


비트 연산에는 어떤 것들이 있죠? AND(&), OR(|), NOT(~), XOR(^), 쉬프트(<<, >>)가 있죠. 여기서는 AND와 쉬프트를 사용할 겁니다.


AND 연산자를 사용하면 원하는 자리수에 대해 비트의 값을 알 수 있습니다. AND의 의미가 양쪽의 두 값을 비트 단위로 비교하여 둘 다 1이면 1을, 아니면 0을 보여달라는 것이기 때문이죠. 만약 25의 20 자리의 비트를 알고 싶다면,


bit = (25 & 1) ? 1 : 0;


이렇게 25와 20을 AND 연산하면 됩니다. 그리고 조건 연산자를 이용해서 1 또는 0으로 표현하는 거죠.


25 == 00000000 00000000 00000000 00011001

  1 == 00000000 00000000 00000000 00000001


  1 == 00000000 00000000 00000000 00000001


그리고 내부적으로 이런 과정을 거쳐 1이란 값이 나옵니다. 마찬가지로 21 자리를 구하려면 21을, 22 자리는 22과 AND 연산하면 됩니다.


이제, 코드를 볼까요?


include <stdio.h>

int main(void)
{
int num;
int i;

printf("정수 하나 끄적여봐. : ");
scanf("%d", &num);

printf("\n이거 비트가 어떻게 되냐면... \n");
for(i = 31; i >= 24; i--) printf("%d", (num & (1 << i)) ? 1 : 0);
printf(" ");
for(i = 23; i >= 16; i--) printf("%d", (num & (1 << i)) ? 1 : 0);
printf(" ");
for(i = 15; i >= 8; i--) printf("%d", (num & (1 << i)) ? 1 : 0);
printf(" ");
for(i = 7; i >= 0; i--) printf("%d", (num & (1 << i)) ? 1 : 0);
printf("\n");

return 0;
}


자리수를 일일이 적어주는 것은 귀찮으니까 반복문을 사용하고 쉬프트 연산으로 자리수를 정해줍니다. 한 칸, 한 칸 착실히 옮겨 가면서 비트를 보여달라는 거죠. 코드 짜는 사람은 귀찮아서 반복문 사용하면서 컴퓨터에게는 하나하나 비교하라니 너무 부려먹는 건가요?


오늘이 2009년 1월 7일이니 20090107의 비트를 확인 해보겠습니다.


사용자 삽입 이미지

아, 민망해라. 결국 비트를 엿보고 말았네요. 정수는 여러모로 사람과 친숙한 수 체계라 간단하죠. 문제는 역시 실수입니다. 다음에는 실수의 비트를 엿보러 가보겠습니다.

크리에이티브 커먼즈 라이센스
Creative Commons License

6l4ck3y3 #1. 내 머리 속의 노트/C 언어 마스터 Go! gO! , , ,

Trackback Address:http://hisjournal.net/blog/trackback/118
[로그인][오픈아이디란?]