본문 바로가기
개발/C, C++

비트 on / off

by 피로물든딸기 2023. 1. 24.
반응형

C, C++ 전체 링크

삼성 C형 전체 링크

 

참고

- 비트 단위로 출력하기

 

구현은 아래를 참고하자.

#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;
}

반응형

댓글