이 글에서는 Java에서 두 개의 이진 문자열(binary string)을 더하는 방법을 단계별로 살펴보겠습니다. 이진 문자열이란 0과 1의 조합으로 표현되는 수를 의미하며, 컴퓨터가 데이터를 처리하는 가장 기본적인 형태입니다.
먼저 간단한 입출력 예시를 통해 어떤 결과를 만들 것인지 확인해 보겠습니다.
입력 및 출력 예시
예를 들어 아래와 같은 두 개의 이진수가 입력으로 주어졌다고 가정해 보겠습니다.
입력
10101 10001
출력
두 이진수를 더한 결과는 다음과 같습니다.
100110
알고리즘
이 문제는 일반적인 10진수 덧셈과 같은 원리로 해결할 수 있습니다. 각 자릿수를 하나씩 더하면서 합이 2 이상일 경우 캐리(carry, 올림수)를 다음 자릿수로 넘겨주는 방식입니다.
- 시작 – 프로그램을 실행합니다.
- Scanner 객체 생성 – 사용자 입력을 받기 위한 Scanner 객체를 생성합니다.
- 이진수 입력 – 두 개의 이진수를 입력받습니다.
- 캐리 변수 정의 – 올림수를 저장할 carry 변수를 0으로 초기화합니다.
- 반복 조건 검사 – while문을 사용해 두 입력값 중 하나라도 0이 아니면 반복을 계속합니다.
- 비트 단위 덧셈 수행 – % 연산자(나머지)와 캐리 값을 이용해 각 자릿수를 더하고 결과를 배열에 저장합니다.
- 결과 출력 – 배열에 저장된 값을 역순으로 출력하여 최종 합을 보여줍니다.
- 종료 – 프로그램을 마칩니다.
예제 1: 사용자 입력으로 구현하기
아래 예제는 실행 중에 사용자가 직접 두 개의 이진수를 입력하면 그 합을 계산하여 출력하는 방식입니다.
import java.util.*;
public class AddBinaryNumbers {
public static void main(String[] args) {
long binary_input_1 , binary_input_2 ;
System.out.println("필요한 패키지가 모두 임포트되었습니다");
Scanner input = new Scanner(System.in);
System.out.println("입력을 위한 reader 객체가 생성되었습니다 ");
System.out.print("첫 번째 이진수를 입력하세요 : ");
binary_input_1 = input.nextLong();
System.out.print("두 번째 이진수를 입력하세요 : ");
binary_input_2 = input.nextLong();
int i, carry ;
i = 0;
carry = 0;
int[] binary_sum = new int[10];
while (binary_input_1 != 0 || binary_input_2 != 0) {
binary_sum[i++] = (int) (carry + (binary_input_1 % 10 + binary_input_2 % 10) % 2);
carry = (int) ((binary_input_1 % 10 + binary_input_2 % 10 + carry) / 2);
binary_input_1 = binary_input_1 / 10;
binary_input_2 = binary_input_2 / 10;
}
if (carry != 0) {
binary_sum[i++] = carry;
}
--i;
System.out.print("\n두 이진수의 합은 : ");
while (i >= 0) {
System.out.print(binary_sum[i--]);
}
System.out.print("\n");
}
}실행 결과
필요한 패키지가 모두 임포트되었습니다 입력을 위한 reader 객체가 생성되었습니다 첫 번째 이진수는 10101 두 번째 이진수는 10001 이진수의 합은: 100110
예제 2: 값이 미리 정의된 경우
다음 예제는 입력값이 코드 안에 미리 정의되어 있으며, 그 값을 콘솔에 바로 출력하는 방식입니다. 테스트나 디버깅 시 유용하게 활용할 수 있습니다.
public class AddingBinaryNumbers {
public static void main(String[] args) {
long binary_input_1 , binary_input_2 ;
binary_input_1 = 10101;
binary_input_2 = 10001;
System.out.print("첫 번째 이진수는 " + binary_input_1);
System.out.print("\n두 번째 이진수는 " + binary_input_2);
int i, carry ;
i = 0;
carry = 0;
int[] binary_sum = new int[10];
while (binary_input_1 != 0 || binary_input_2 != 0) {
binary_sum[i++] = (int) (carry + (binary_input_1 % 10 + binary_input_2 % 10) % 2);
carry = (int) ((binary_input_1 % 10 + binary_input_2 % 10 + carry) / 2);
binary_input_1 = binary_input_1 / 10;
binary_input_2 = binary_input_2 / 10;
}
if (carry != 0) {
binary_sum[i++] = carry;
}
--i;
System.out.print("\n두 이진수의 합은: ");
while (i >= 0) {
System.out.print(binary_sum[i--]);
}
System.out.print("\n");
}
}실행 결과
첫 번째 이진수는 10101 두 번째 이진수는 10001 두 이진수의 합은: 100110
코드 동작 원리 살펴보기
핵심 로직은 while 루프 내부에 있습니다. % 10 연산으로 각 숫자의 마지막 자릿수(0 또는 1)를 추출하고, 두 자릿수의 합에 대해 % 2를 적용하면 해당 자릿수의 결과 비트를 얻을 수 있습니다. 동시에 / 2 연산으로 캐리를 계산하여 다음 자릿수 덧셈에 반영합니다. 이 과정은 십진수 덧셈에서 올림수를 처리하는 것과 정확히 같은 원리입니다.
루프가 종료된 후에도 캐리 값이 남아 있다면, 이는 최상위 자릿수에서 발생한 올림이므로 결과 배열에 추가로 저장해 줍니다. 마지막으로 배열은 낮은 자릿수부터 차례로 저장되어 있기 때문에, 역순으로 출력해야 올바른 이진수 결과를 얻을 수 있습니다.