[출처 : http://mwultong.blogspot.com/2007/06/c-bit-on-off-set-bit-save-bit.html]


부호없는 16비트 정수 즉 "unsigned short"형 숫자에서 특정 비트를 켜고 끄는 방법입니다. 아래의 "setAbit(숫자, 몇번째비트, 1또는0)" 함수를 사용하면 됩니다. 특정 비트를 1또는 0으로 설정한 후, 그 결과를 다시 "unsigned short"으로 반환합니다. 따라서 이 함수로, 어떤 숫자를 비트 단위로 조작할 수 있습니다.

특정 비트 조작, 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;
}



컴파일 및 실행 결과 화면:
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>

+ Recent posts