문제
내가 작성한 정답 - with gpt
10진수로 변환하여 덧셈
class Solution {
public String solution(String bin1, String bin2) {
int num1 = Integer.parseInt(bin1,2); // 2진수 -> 10진수
int num2 = Integer.parseInt(bin2,2);
int sum = num1+num2;
return Integer.toBinaryString(sum); // 10진수 -> 2진수 문자열로 변경
}
}
비트 연산 사용
: 💡 자바에서 모든 정수(int)는 실제 메모리에 2진수로 저장되는 것을 이용
아래의 코드에서 num1,num2 는 10진수이지만 비트연산을 수행하면 이진수처럼 동작한다.
class Solution {
public String solution(String bin1, String bin2) {
int num1 = Integer.parseInt(bin1, 2);
int num2 = Integer.parseInt(bin2, 2);
// 이진수 덧셈을 비트 연산으로 구현
while (num2 != 0) {
int carry = (num1 & num2) << 1; // 자리올림 계산
num1 = num1 ^ num2; // XOR로 합 구하기
num2 = carry; // 자리올림 반영
}
return Integer.toBinaryString(num1);
}
// 덧셈 과정
1. XOR(^) 연산을 사용하여 자리올림 없이 두 숫자 더한다.
2. AND(&) 연산을 사용하여 자리올림 값(carry) 을 계산.
3. carry 값을 왼쪽으로 한 칸 이동(<< 1)하면, 실제로 자리올림이 적용된 위치가 된다.
4. num2가 0이 될 때까지 반복하면 덧셈 완료!
비트 연산
- AND 연산 (&) 두 비트가 모두 1일 때만 결과가 1이 됨. 하나라도 0이면 결과는 0.
int a = 5; // 0101 (2진수)
int b = 3; // 0011 (2진수)
int result = a & b; // 0001 (2진수) = 1 (10진수)
System.out.println(result); // 출력: 1
0101 (5)
& 0011 (3)
------------
0001 (1) <- AND 연산 결과
- OR 연산 (|) 둘 중 하나라도 1이면 결과가 1이 됨. 둘 다 0일 때만 0.
int a = 5; // 0101 (2진수)
int b = 3; // 0011 (2진수)
int result = a | b; // 0111 (2진수) = 7 (10진수)
System.out.println(result); // 출력: 7
0101 (5)
| 0011 (3)
------------
0111 (7) <- OR 연산 결과
- XOR 연산 (^) 두 비트가 다르면 1, 같으면 0.
int a = 5; // 0101 (2진수)
int b = 3; // 0011 (2진수)
int result = a ^ b; // 0110 (2진수) = 6 (10진수)
System.out.println(result); // 출력: 6
0105 (5)
^ 0011 (3)
------------
0110 (6) <- XOR 연산 결과
- NOT 연산 (~) 비트를 반전(0 → 1, 1 → 0) 시킴. 부호가 바뀜 (음수 변환 효과)
int a = 5; // 0000 0101 (2진수)
int result = ~a; // 1111 1010 (2진수) = -6 (10진수)
System.out.println(result); // 출력: -6
0000 0101 (5)
~ 1111 1010 (-6)
- 왼쪽 시프트 (<<) - 비트 이동 연산 (Shift 연산) 비트를 왼쪽으로 이동, 오른쪽에 0 추가 → 2배 증가 효과 a << n → a × (2^n)
int a = 5; // 0000 0101 (2진수)
int result = a << 2; // 0001 0100 (2진수) = 20 (10진수)
System.out.println(result); // 출력: 20
0000 0101 (5)
<< 2
0001 0100 (20) <- 왼쪽으로 2칸 이동
- 오른쪽 시프트 (>>) - 비트 이동 연산 (Shift 연산) 비트를 오른쪽으로 이동, 왼쪽 빈칸에 부호비트 유지 → x1/2 효과 a >> n → a ÷ (2^n)
int a = 20; // 0001 0100 (2진수)
int result = a >> 2; // 0000 0101 (2진수) = 5 (10진수)
System.out.println(result); // 출력: 5
0001 0100 (20)
>> 2
0000 0101 (5) <- 오른쪽으로 2칸 이동
- 부호 없는 오른쪽 시프트 (>>>) - 비트 이동 연산 (Shift 연산) 부호비트까지 무조건 0으로 채움 (음수도 양수처럼 이동)
int a = -8; // 1111 1000 (2진수, 음수)
int result = a >>> 2; // 0011 1110 (2진수) = 1073741822 (양수로 변경됨)
System.out.println(result); // 출력: 1073741822
- 정리!

다른 사람들의 정답
class Solution {
public String solution(String bin1, String bin2) {
// 이진수를 십진수로 변환하여 더한 후 Integer.toString(,2)으로 이진수에 맞는 문자열로 변환
return Integer.toString(Integer.parseInt(bin1, 2) + Integer.parseInt(bin2, 2),2);
}
}
Integer.toBinaryString() vs Integer.toString() 차이
- Integer.toBinaryString(int n) : 정수 → 이진수 문자열 - 정수를 이진수 문자열(2진법) 로 변환 - 0b 같은 접두사 없이 순수한 이진수 문자열 반환
int num = 10;
String binary = Integer.toBinaryString(num);
System.out.println(binary); // 출력: "1010" (10진수 10 → 2진수 "1010")
- Integer.toString(int n, int radix) : 정수 → 특정 진법 문자열 - n을 radix(진수)에 맞는 문자열로 변환 - radix가 2면 toBinaryString()과 동일 - radix = 16이면 16진수, 8이면 8진수로 변환 가능
int num = 10;
String binary = Integer.toString(num, 2); // 2진수 변환
String octal = Integer.toString(num, 8); // 8진수 변환
String hex = Integer.toString(num, 16); // 16진수 변환
System.out.println(binary); // 출력: "1010"
System.out.println(octal); // 출력: "12"
System.out.println(hex); // 출력: "a"
Share article