개발/C, C++
비트 on / off
피로물든딸기
2023. 1. 24. 18:54
반응형
참고
구현은 아래를 참고하자.
#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;
}
반응형