[출처 : http://ask.nate.com/qna/view.html?n=294920]

#include 〈stdio.h〉

#define toOne(a, n) (a | (1 << n))
#define toZero(a, n) ((a^0xffff)^((1 << n)^0xffff))

void main(void)
{
int a;
a = 0x01FF;
printf ("%4x\n", a);
printf ("%4x\n", toOne(a, 8));
printf ("%4x\n", toZero(a, 8));
printf ("%4x\n", toOne(a, 7));
printf ("%4x\n", toZero(a, 7));
}


------------------------------------------------------------


32 bit 길이의 integer에서 특정 bit을
0이나 1로 바꿀 수 있는 기능을 말씀하시는 것 아닙니까? ^^
위에 만든 예제가 바로 그것인데요, 특정 bit을 0이나 1로
setting할 수 있도록 만든 것입니다.

1.
먼저, 특정 bit을 1로 만드는 경우는
원래의 수와 특정 bit만 1로 set이 되고 나머지 bit는 0인 수를
XOR하면 얻을 수 있습니다.

2.
특정 bit을 0으로 만드는 경우는
원래의 수를 bitwise XOR한 수와
특정 bit만 0으로 set되고 나머지 bit는 1인 수를
XOR하면 얻을 수 있습니다.

여기에서 toOne(a,n)이라 정의한 부분은
(물른 inline 함수 등으로 구현하면 더욱 좋겠지요)
어떤 수(a)에서 특정 번째 bit(n)만 1로 만드는 역할을 합니다.
이는 위에서 설명한 바와 같구요,
toZero(a,n)이라 정의한 부분은
특정 bit만 0으로 만드는 역할을 합니다.
이 때 (a^0xffff)라 한 부분은 주어진 수를
bitwise XOR하는 역할을 하고,
((1 << n)^0xffff)는 특정 bit만
0으로 set된 수를 반환합니다.

제가 만든 프로그램에서는 integer 0x1ff를 가지고
특정 bit을 0이나 1로 만드는 시험을 해 봤는데요... ^^
해 보시면 아시겠지만 아주 성공적이었습니다.
물론, 이 때 n >= 0이어야 겠죠.
n == 0인 경우에도 잘 동작합니다. ^^

+ Recent posts