Copyright (c) 2015-, All Rights Reserved by Kwanghoon Choi
(아래 강의 노트를 자유롭게 이용하되 다른 웹 사이트 등을 통한 배포를 금합니다.)
The C Programming Language 2nd Ed. by Kerninghan & Ritchie ( Ch.2, getbits )
getbits 함수를 이용해서 1234567890에서 (비트 표현에서) 20번째 비트에서 10개 비트 (20번째, 19번째, ..., 11번째 비트)를 추출하는 예를 살펴보자.
실행 예제
1234567890
x :
0 1 0 0 1 0 0 1 1 0 0 1 0 1 1 0 0 0 0 0 0 0 1 0 1 1 0 1 0 0 1 0
20 10
p : 20
n : 10
x >> (p+1-n) :
0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 1 0 0 1 0 1 1 0 0 0 0 0 0
~0 << n :
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
~(~0 << n) :
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1
r :
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0
getbits 함수와 테스트 프로그램을 통해 비트 연산자와 이 함수의 동작을 이해한다.
#include <stdio.h>
unsigned getbits(unsigned x, int p, int n);
void print(unsigned x);
int main() {
unsigned r, x;
int p;
int n;
printf("x : ");
scanf("%u", &x);
printf("x : \n\t" ); print(x);
printf("p n : ");
scanf("%d %x", &p, &n);
printf("p : %d \n" , p);
printf("n : %d \n" , n);
r = getbits( x, p, n );
printf("r : \n\t" ); print(r);
return 0;
}
// print bits
void print(unsigned x) {
int i;
for (i=sizeof(unsigned)*8-1; i>=0; i--)
if ( x >> i & 0x01 )
printf(" 1 ");
else
printf(" 0 ");
printf("\n");
}
// getbits : pth bit, (p-1)th bit, ..., (p-n+1)th bit of x
// E.g.,
// x : 0 1 0 1 1 0
// p : 5
// n : 3
// getbits(x,p,n) : 0 1 0
unsigned getbits(unsigned x, int p, int n) {
printf("x >> (p+1-n) :\n\t");
print(x >> (p+1-n));
printf("~0 << n :\n\t");
print(~0 << n);
printf("~(~0 << n) :\n\t");
print(~(~0 << n));
return x >> (p+1-n) & ~(~0 << n);
}