개요
10진수(decimal) 숫자 하나가 입력으로 주어졌을 때, 이를 2진수(binary) 형태로 변환하는 것이 이 글의 목표입니다.
컴퓨터에서 10진수는 밑(base)이 10인 수 체계로 표현되며, 0~9 사이의 임의의 숫자를 사용할 수 있습니다. 반면 2진수는 밑이 2인 수 체계로, 오직 0과 1 두 개의 비트만으로 모든 값을 표현합니다. 컴퓨터 내부의 모든 데이터는 결국 0과 1로 처리되기 때문에, 10진수를 2진수로 변환하는 방법은 프로그래밍의 가장 기본적인 개념 중 하나입니다.
변환 절차
10진수를 2진수로 바꾸려면 아래 단계를 따르면 됩니다.
- 1단계: 주어진 수를 목표 진법의 밑 값(2진수이므로 2)으로 나눕니다. 예를 들어 42를 2진수로 변환한다면 42 ÷ 2를 계산해 몫과 나머지를 구하고, 나머지가 0이면 그 자리의 비트를 0, 나머지가 1이면 1로 기록합니다.
- 2단계: 앞서 구한 몫을 다시 밑 값 2로 나누고, 새로운 나머지(비트)를 계속 저장합니다.
- 3단계: 저장된 비트들을 오른쪽 시프트(right shift)하듯 한 자리씩 이동시키며 같은 작업을 반복합니다.
- 4단계: 몫이 더 이상 나누어지지 않을 때(0이 될 때)까지 반복한 뒤, 기록된 비트들을 역순으로 배열하면 최종 2진수가 완성됩니다.
다음은 10진수를 2진수로 변환하는 과정을 그림으로 표현한 것입니다.

예시
입력값: 42
42를 밑 2로 나눔 : 42 / 2 = 나머지 0, 몫 21
몫을 밑 2로 나눔 : 21 / 2 = 나머지 1, 몫 10
몫을 밑 2로 나눔 : 10 / 2 = 나머지 0, 몫 5
몫을 밑 2로 나눔 : 5 / 2 = 나머지 1, 몫 2
몫을 밑 2로 나눔 : 2 / 2 = 나머지 0, 몫 1
마지막으로 비트를 역순으로 배열해 최종값을 얻습니다.
출력값: 101010
알고리즘
시작
단계 1 -> 10진수를 2진수로 변환하는 함수 선언
int convert(int num)
for 루프: int i = 31; i >= 0; i--
int k = num >> i 로 설정
만약 (k & 1) 이라면
"1" 출력
아니라면
"0" 출력
단계 2 -> main() 함수 안에서
int num = 42 로 선언 및 초기화
convert(num) 호출
종료
C++ 코드 구현 (비트 시프트 방식)
아래 코드는 비트 연산자(>>, &)를 활용해 32비트 전체를 검사하며 2진수를 출력하는 방식입니다. 숫자를 i칸만큼 오른쪽 시프트한 뒤 마지막 비트(k & 1)를 확인하면 해당 위치의 비트 값이 무엇인지 알 수 있습니다.
#include <iostream>
using namespace std;
// 10진수를 2진수로 변환
int convert(int num) {
for (int i = 31; i >= 0; i--) {
int k = num >> i;
if (k & 1)
cout << "1";
else
cout << "0";
}
}
int main() {
int num = 42;
convert(num);
}
출력 결과
위 코드를 실행하면 다음과 같은 출력이 생성됩니다.
00000000000000000000000000101010
32비트 int 타입 전체를 대상으로 검사하기 때문에 유효한 비트 앞쪽에 0들이 함께 출력됩니다. 실제 2진수 값은 맨 뒤의 101010입니다.
대안: 나눗셈과 나머지 연산 활용
비트 연산 대신 나눗셈(/)과 나머지(%) 연산자를 사용해도 동일한 결과를 얻을 수 있습니다. 이 방식은 불필요한 선행 0 없이 필요한 비트만 출력할 수 있다는 장점이 있습니다.
#include <iostream>
using namespace std;
// 10진수를 2진수로 변환 (나눗셈·나머지 방식)
long long decToBinary(int num) {
long long binary = 0;
int place = 1;
while (num > 0) {
int remainder = num % 2; // 나머지(비트) 추출
binary += remainder * place;
place *= 10;
num /= 2; // 몫으로 갱신
}
return binary;
}
int main() {
int num = 42;
cout << decToBinary(num); // 101010 출력
return 0;
}
이 코드를 실행하면 101010이 출력됩니다. 다만 입력값이 커지면 long long 범위를 초과할 수 있으므로, 큰 수를 다룰 때는 문자열이나 std::bitset을 사용하는 것이 좋습니다.