C 프로그래밍 (K&R,Ch.2, getbits)

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);
}

Leave a Reply

Your email address will not be published. Required fields are marked *