정수형 숫자가 하나 주어졌을 때, 먼저 해당 숫자의 이진수 표현을 구하고, 그 숫자의 총 비트 수를 계산하는 것이 목표입니다.
입력 − int number = 50
출력 − 숫자의 총 비트 수 − 6
설명 − 50의 이진수 표현은 110010입니다. 만약 8자리 숫자로 계산하면 앞에 두 개의 0이 붙어 00110010이 되지만, 실제 유효한 비트는 6개이므로 총 비트 수는 6입니다.
입력 − int number = 10
출력 − 숫자의 총 비트 수 − 4
설명 − 10의 이진수 표현은 1010입니다. 8자리 숫자로 나타내면 앞에 네 개의 0이 붙어 00001010이 되며, 유효한 비트 수는 4개입니다.
프로그램에 사용된 접근 방식
정수형 변수에 숫자를 입력받습니다.
총 비트 수를 저장할 unsigned int 타입의 count 변수를 선언합니다.
i를 1 << 7부터 시작하여 i > 0인 동안 i를 i / 2로 줄여가며 FOR 루프를 실행합니다.
루프 내부에서 num & i가 참(TRUE)이면 1을 출력하고, 그렇지 않으면 0을 출력하여 8비트 이진수를 표시합니다.
숫자가 0이 아닐 때까지 반복하는 while 루프를 시작해 총 비트 수를 계산합니다.
루프 내부에서 count 값을 1씩 증가시키고, number >>= 1로 숫자를 오른쪽으로 시프트합니다.
최종적으로 count를 출력합니다.
예제 코드
#include <iostream>
using namespace std;
// 숫자의 총 비트 수 계산
unsigned int bits(unsigned int number){
unsigned int count = 0;
unsigned int i;
// 8비트 이진수 표시
cout << "8-bit digits of " << number << " is: ";
for (i = 1 << 7; i > 0; i = i / 2){
(number & i) ? cout << "1" : cout << "0";
}
// 숫자의 총 비트 수 계산
while (number){
count++;
number >>= 1;
}
cout << "\nCount of total bits in a number are: " << count;
}
int main(){
int number = 50;
bits(number);
return 0;
}출력 결과
위 코드를 실행하면 다음과 같은 출력이 생성됩니다.
8-bit digits of 50 is: 00110010 Count of total bits in a number are: 6
동작 원리 정리
이 코드의 핵심은 두 가지 부분으로 나눌 수 있습니다. 첫 번째는 비트 마스크(1 << 7부터 시작해 절반씩 줄여가는 방식)를 활용해 숫자를 8비트 이진수로 화면에 출력하는 부분이고, 두 번째는 오른쪽 시프트 연산(>>= 1)을 반복하면서 숫자가 0이 될 때까지 카운트를 증가시켜 유효 비트 수를 구하는 부분입니다.
오른쪽 시프트 연산은 숫자를 2로 나누는 것과 같은 효과가 있으므로, 숫자가 0이 될 때까지 몇 번 시프트했는지 세면 그것이 곧 유효 비트의 개수가 됩니다. 예를 들어 50(110010)은 6번의 시프트 후 0이 되므로 총 비트 수는 6입니다.