[알고리즘문제풀기] 이진수 더하기

silver's avatar
Jan 17, 2025
[알고리즘문제풀기] 이진수 더하기

문제

내가 작성한 정답 - 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이 될 때까지 반복하면 덧셈 완료!
💡

비트 연산

  1.  AND 연산 (&) 두 비트가 모두 1일 때만 결과가 1이 됨. 하나라도 0이면 결과는 0.
    1. 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 연산 결과
  1. OR 연산 (|) 둘 중 하나라도 1이면 결과가 1이 됨. 둘 다 0일 때만 0.
    1. 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 연산 결과
  1. XOR 연산 (^) 두 비트가 다르면 1, 같으면 0.
    1. 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 연산 결과
  1. NOT 연산 (~) 비트를 반전(0 → 1, 1 → 0) 시킴. 부호가 바뀜 (음수 변환 효과)
    1. 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)
  1. 왼쪽 시프트 (<<) - 비트 이동 연산 (Shift 연산) 비트를 왼쪽으로 이동, 오른쪽에 0 추가 → 2배 증가 효과 a << n → a × (2^n)
    1. 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칸 이동
  1. 오른쪽 시프트 (>>) - 비트 이동 연산 (Shift 연산) 비트를 오른쪽으로 이동, 왼쪽 빈칸에 부호비트 유지 → x1/2 효과 a >> n → a ÷ (2^n)
    1. 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칸 이동
  1. 부호 없는 오른쪽 시프트 (>>>) - 비트 이동 연산 (Shift 연산) 부호비트까지 무조건 0으로 채움 (음수도 양수처럼 이동)
    1. int a = -8; // 1111 1000 (2진수, 음수) int result = a >>> 2; // 0011 1110 (2진수) = 1073741822 (양수로 변경됨) System.out.println(result); // 출력: 1073741822
  1. 정리!
notion image
 

다른 사람들의 정답

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() 차이
  1. Integer.toBinaryString(int n) : 정수 → 이진수 문자열 - 정수를 이진수 문자열(2진법) 로 변환 - 0b 같은 접두사 없이 순수한 이진수 문자열 반환
    1. int num = 10; String binary = Integer.toBinaryString(num); System.out.println(binary); // 출력: "1010" (10진수 10 → 2진수 "1010")
  1. Integer.toString(int n, int radix) : 정수 → 특정 진법 문자열 - n을 radix(진수)에 맞는 문자열로 변환 - radix가 2면 toBinaryString()과 동일 - radix = 16이면 16진수, 8이면 8진수로 변환 가능
    1. 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

silver