반응형
2n 또는 2n - 1 판단하기.
숫자 x에서 -1을 하고 & 연산을 해서 0이 되면 2n이다.
그리고 x에서 +1을 하고 & 연산을 해서 0이 되면 2n - 1이다.
2n은 bit로 나타내면 하나의 bit만 1이기 때문에 이런 규칙이 생긴다.
0100 0000 = 64
0011 1111 = 63
------------------
0000 0000 = 64 & 63 = 0
마찬가지로 2n - 1도 연산을 해보면 쉽게 규칙을 파악할 수 있다.
0111 1111 = 127
1000 0000 = 128
-------------------
0000 0000 = 127 & 128 = 0
#include <stdio.h>
int main(void)
{
int x;
/* 주어진 부호 없는 정수가 2의 거듭제곱이나 0인지 판정 */
printf("check power of n\n");
x = 15;
printf("%d is power of n (%d)\n", x, x & (x - 1));
x = 256;
printf("%d is power of n (%d)\n", x, x & (x - 1)); // 결과는 0
putchar('\n');
printf("========================================\n");
/* 주어진 부호 없는 정수가 2의 거듭제곱 -1 이나 0인지 판정 */
printf("check power of n - 1\n");
x = 15;
printf("%d is power of n - 1 (%d)\n", x, x & (x + 1)); // 결과는 0
x = 253;
printf("%d is power of n - 1 (%d)\n", x, x & (x + 1));
putchar('\n');
printf("========================================\n");
return 0;
}
2n으로 올림 / 내림
어떤 숫자를 특정한 배수로 올림 또는 내림할 수 있다.
예를 들어서 x가 205인 경우에 32의 배수로 올림하면 224되고, 32의 배수로 내림하면 192가 된다.
올림을 구하는 방법은 다음과 같다.
1) x에 2n - 1을 더한다.
2) x에 & ~(2n - 1)연산을 한다.
내림을 구하는 방법은 더 간단하다.
1) x에 & ~(2n - 1)연산을 한다.
(2n - 1)의 ~ 연산에 & 연산은 bit를 모두 클리어 시키는 효과가 있기 때문에 이런 결과가 나오게 된다.
int main(void)
{
unsigned int x;
x = 205;
x += (31);
x &= ~(31);
printf("%d\n", x); // 224
x = 205;
x &= ~(31);
printf("%d\n", x); // 192
/* & ~ 대신 -연산도 가능 */
x = 205;
printf("%d\n", (x + 31) & -32); // 224
printf("%d\n", x & -32); // 192
return 0;
}
반응형
'개발 > C, C++' 카테고리의 다른 글
C, C++ - 1차원 비트 회전하기 (Rotate Bits of a Number) (0) | 2023.07.30 |
---|---|
C, C++ - 1 비트 개수 세기 (Bit Counter) (0) | 2023.07.29 |
C, C++ - 임시 변수 없이 변수 바꾸기 (Swap Two Numbers without using the Third Variable) (0) | 2023.07.29 |
C, C++ - 비트 연산 기본 매크로 함수 (bit macro : get, set, clear, toggle, check) (0) | 2023.07.29 |
C, C++ - 비트 단위로 출력하기 (Print Bit) (0) | 2023.06.03 |
댓글