반응형
참고
구현은 아래를 참고하자.
#include <stdio.h>
template <typename T>
void printBitNumber(T number)
{
unsigned int bitSize = sizeof(number) * 8;
T mask = (1ull) << (bitSize - 1);
printf("%d", (number & mask) == mask);
mask = (1ull) << (bitSize - 2);
for (int i = 1; i < bitSize; i++)
{
printf("%d", (number & mask) == mask);
mask >>= 1;
if (i % 8 == 7) printf(" ");
}
putchar('\n');
}
int main(void)
{
int x;
printf("제일 오른쪽 1-비트 끄기 (ex: 01011000 => 01010000)\n");
x = 2152;
printBitNumber(x);
x &= (x - 1);
printBitNumber(x);
printf("========================================\n");
printf("제일 오른쪽 0-비트 켜기 (10100111 => 10101111)\n");
x = 2151;
printBitNumber(x);
x |= (x + 1);
printBitNumber(x);
printf("========================================\n");
printf("뒤에 달린 후행 1-비트 모두 끄기 (10100111 => 10100000)\n");
x = 2151;
printBitNumber(x);
x &= (x + 1);
printBitNumber(x);
printf("========================================\n");
printf("뒤에 달린 후행 0-비트 모두 켜기 (10101000 => 10101111)\n");
x = 2152;
printBitNumber(x);
x |= (x - 1);
printBitNumber(x);
printf("========================================\n");
printf("제일 오른쪽 0-비트에 해당하는 비트만 0인 워드를 만들기. (10101000 => 11110111)\n");
x = 2152;
printBitNumber(x);
x = ~x | (x - 1);
printBitNumber(x);
printf("========================================\n");
printf("후행 0-비트에 해당하는 비트만 1인 워드 (10100111 => 00001000)\n");
x = 2152;
printBitNumber(x);
x = ~x & (x + 1);
printBitNumber(x);
printf("========================================\n");
printf("후행 0-비트들에 해당하는 비트들만 1이고 다른 비트들은 0 (01011000 => 00000111)\n");
x = 2152;
printBitNumber(x);
x = ~x & (x - 1); // ~(x|-x), (x&-x) - 1
printBitNumber(x);
printf("========================================\n");
printf("후행 1-비트들에 해당하는 비트만 0 다른 비트는 1 (10100111 => 11111000)\n");
x = 2152;
printBitNumber(x);
x = ~x | (x + 1);
printBitNumber(x);
printf("========================================\n");
printf("제일 오른쪽 1-비트만 남겨두기 (01011000 => 00001000)\n");
x = 2152;
printBitNumber(x);
x = x & (-x);
printBitNumber(x);
printf("========================================\n");
printf("제일 오른쪽 1-비트와 후행 0-비트들에 해당하는 비트들만 1로 변경 (01011000 => 00001111)\n");
x = 2152;
printBitNumber(x);
x = x ^ (x - 1);
printBitNumber(x);
printf("========================================\n");
printf("제일 오른쪽 0-비트와 후행 1-비트들에 해당하는 비트들만 1로 변경 (01010111 => 00001111)\n");
x = 2152;
printBitNumber(x);
x = x ^ (x + 1);
printBitNumber(x);
printf("========================================\n");
return 0;
}
반응형
'개발 > C, C++' 카테고리의 다른 글
C++ - 튜플로 여러 값 반환하기 (Returning Multiple Values Using Tuple) (0) | 2023.04.15 |
---|---|
scanf를 이용해 정수 1칸 입력 받기 (0) | 2023.03.26 |
N x N 2차원 배열 뒤집기, 회전하기 (Rotate, Flip 2D Array) (0) | 2022.11.27 |
100명의 죄수가 살아남을 확률을 높이기 위한 루프 전략 (Loop Strategy) (4) | 2022.09.24 |
C, C++ - Window Visual Studio에서 폴더의 모든 파일 통합하기 (0) | 2022.08.09 |
댓글