두 개의 숫자를 입력받아 그 차이를 반환하는 JavaScript 함수를 작성해야 합니다. 조건은 하나, 바로 마이너스(-) 기호를 사용하지 않고 뺄셈을 구현하는 것입니다.
접근 방식: 비트 연산 활용하기
마이너스 기호 없이 뺄셈을 수행하려면 비트 연산(bitwise operation)을 활용할 수 있습니다. 핵심 원리는 다음과 같습니다.
- XOR(^) 연산은 자리올림(carry)을 무시한 상태에서 각 비트의 차이를 계산합니다.
- AND(&) 연산으로 두 숫자에서 겹치는 비트를 찾고, 왼쪽 시프트(<<)를 한 칸 적용하면 자리올림 값이 됩니다.
이 과정을 재귀적으로 반복하면 자리올림이 0이 되는 순간, 즉 최종 뺄셈 결과가 도출됩니다.
예제 코드
다음은 전체 구현 코드입니다 −
const num1 = 56;
const num2 = 78;
const subtractWithoutMinus = (num1, num2) => {
if(num2 === 0){
return num1;
};
return subtractWithoutMinus(num1 ^ num2, (~num1 & num2) << 1);
};
console.log(subtractWithoutMinus(num2, num1));실행 결과
콘솔에 출력되는 결과는 다음과 같습니다 −
22
78에서 56을 뺀 값인 22가 정상적으로 출력되었습니다. 함수 내부에서는 뺄셈 연산자를 전혀 사용하지 않고, 오직 XOR, NOT(~), AND, 시프트 연산만으로 결과를 얻어냅니다.
동작 원리 살펴보기
첫 번째 호출에서 num1 ^ num2는 자리올림을 제외한 차이를 계산하고, (~num1 & num2) << 1은 실제로 넘겨야 할 자리올림을 만들어냅니다. 재귀 호출마다 자리올림 값이 점점 작아지다가 결국 0이 되고, 그 시점의 첫 번째 인수가 곧 최종 결과가 되는 구조입니다.