반응형

 

C++ 비트값 문자열 다루기, 비트 1의 개수, 비트 문자열 너비 계산 예제  

 

글. 수알치 오상문

 

다음 화면 출력처럼 비트 관련 문자열 만들기, 앞비트 0을 제외한 비트 문자열 길이 계산,, 비트 1의 개수 계산, 비트 문자열 너비 지정 출력 등을 다루는 예제입니다.

 

[예제 출력 화면]

**************************************************
 정수형 비트 길이만큼 비트 너비 출력
**************************************************
 0: 00000000000000000000000000000000, 비트1 개수: 0, 비트 너비: 1
 1: 00000000000000000000000000000001, 비트1 개수: 1, 비트 너비: 1
 2: 00000000000000000000000000000010, 비트1 개수: 1, 비트 너비: 2
 3: 00000000000000000000000000000011, 비트1 개수: 2, 비트 너비: 2
 4: 00000000000000000000000000000100, 비트1 개수: 1, 비트 너비: 3
 5: 00000000000000000000000000000101, 비트1 개수: 2, 비트 너비: 3
 6: 00000000000000000000000000000110, 비트1 개수: 2, 비트 너비: 3
 7: 00000000000000000000000000000111, 비트1 개수: 3, 비트 너비: 3
 8: 00000000000000000000000000001000, 비트1 개수: 1, 비트 너비: 4
 9: 00000000000000000000000000001001, 비트1 개수: 2, 비트 너비: 4
10: 00000000000000000000000000001010, 비트1 개수: 2, 비트 너비: 4
11: 00000000000000000000000000001011, 비트1 개수: 3, 비트 너비: 4
12: 00000000000000000000000000001100, 비트1 개수: 2, 비트 너비: 4
13: 00000000000000000000000000001101, 비트1 개수: 3, 비트 너비: 4
14: 00000000000000000000000000001110, 비트1 개수: 3, 비트 너비: 4
15: 00000000000000000000000000001111, 비트1 개수: 4, 비트 너비: 4
16: 00000000000000000000000000010000, 비트1 개수: 1, 비트 너비: 5

**************************************************
 지정한 비트 길이만큼 비트 너비 출력
**************************************************
 0: 00000000, 비트1 개수: 0, 비트 너비: 1
 1: 00000001, 비트1 개수: 1, 비트 너비: 1
 2: 00000010, 비트1 개수: 1, 비트 너비: 2
 3: 00000011, 비트1 개수: 2, 비트 너비: 2
 4: 00000100, 비트1 개수: 1, 비트 너비: 3
 5: 00000101, 비트1 개수: 2, 비트 너비: 3
 6: 00000110, 비트1 개수: 2, 비트 너비: 3
 7: 00000111, 비트1 개수: 3, 비트 너비: 3
 8: 00001000, 비트1 개수: 1, 비트 너비: 4
 9: 00001001, 비트1 개수: 2, 비트 너비: 4
10: 00001010, 비트1 개수: 2, 비트 너비: 4
11: 00001011, 비트1 개수: 3, 비트 너비: 4
12: 00001100, 비트1 개수: 2, 비트 너비: 4
13: 00001101, 비트1 개수: 3, 비트 너비: 4
14: 00001110, 비트1 개수: 3, 비트 너비: 4
15: 00001111, 비트1 개수: 4, 비트 너비: 4
16: 00010000, 비트1 개수: 1, 비트 너비: 5

**************************************************
 비트 값 1 시작 위치부터 비트 문자열 출력
**************************************************
 0: 0, 비트1 개수: 0, 비트 너비: 1
 1: 1, 비트1 개수: 1, 비트 너비: 1
 2: 10, 비트1 개수: 1, 비트 너비: 2
 3: 11, 비트1 개수: 2, 비트 너비: 2
 4: 100, 비트1 개수: 1, 비트 너비: 3
 5: 101, 비트1 개수: 2, 비트 너비: 3
 6: 110, 비트1 개수: 2, 비트 너비: 3
 7: 111, 비트1 개수: 3, 비트 너비: 3
 8: 1000, 비트1 개수: 1, 비트 너비: 4
 9: 1001, 비트1 개수: 2, 비트 너비: 4
10: 1010, 비트1 개수: 2, 비트 너비: 4
11: 1011, 비트1 개수: 3, 비트 너비: 4
12: 1100, 비트1 개수: 2, 비트 너비: 4
13: 1101, 비트1 개수: 3, 비트 너비: 4
14: 1110, 비트1 개수: 3, 비트 너비: 4
15: 1111, 비트1 개수: 4, 비트 너비: 4
16: 10000, 비트1 개수: 1, 비트 너비: 5

#include <iostream>
#include <cstring>  // memset
#include <iomanip>  // setw
using namespace std;
char bitstr[sizeof(int)*8+1] = {0, };  
void bit_get(unsigned x) {
	unsigned bit = 1<<(sizeof(int)*8-1);
	for(int i=0; i<sizeof(int)*8; i++, bit>>=1) 
		bitstr[i] = (x&bit)?'1':'0';	
}
void bit_print(unsigned x) {
	memset((void *)bitstr, 0, sizeof(int)*8+1);
	bit_get(x);
	cout << bitstr << endl;
}
int bit_one_count(unsigned x) {
	unsigned bit=1, count=0;
	for(int i=0; i<sizeof(int)*8; i++, bit<<=1)
		if (x&bit) count++;
	return count;	
}
int bit_len(unsigned x) {
	unsigned size=1;
	while (1) {
		x >>= 1;
		if (x==0)
			break;
		size++;
	}	
	return size;
}
int main(int argc, char** argv) {	
	cout << "\n**************************************************\n";	
	cout << " 정수형 비트 길이만큼 비트 너비 출력\n";
	cout << "**************************************************\n";		
	for(int i=0; i<17; i++) {
		bit_get(i);
		cout << setw(2) << i << ": " << bitstr << ", 비트1 개수: " 
			 << bit_one_count(i) << ", 비트 너비: " << bit_len(i) << endl;
	}	
	cout << "\n**************************************************\n";
	cout << " 지정한 비트 길이만큼 비트 너비 출력\n";
	cout << "**************************************************\n";		
	unsigned bit_size = 8;
	for(int i=0; i<17; i++) {
		bit_get(i);		
		cout << setw(2) << i << ": " << &bitstr[sizeof(int)*8-bit_size] << ", 비트1 개수: " 
			 << bit_one_count(i) << ", 비트 너비: " << bit_len(i) << endl;
	}	
	cout << "\n**************************************************\n";	
	cout << " 비트 값 1이 시작하는 위치부터 비트 값비 출력\n";
	cout << "**************************************************\n";	
	unsigned len = 8;  // bit_len(16);
	for(int i=0; i<17; i++) {
		bit_get(i);		
		cout << setw(2) << i << ": " << &bitstr[sizeof(int)*8-bit_len(i)] << ", 비트1 개수: " 
			 << bit_one_count(i) << ", 비트 너비: " << bit_len(i) << endl;
	}	
	return 0;
}
반응형

+ Recent posts