/**
 * JavaScript 비트 연산자 정리:
 *
 * 1. & (AND 연산자): 두 비트가 모두 1일 때만 1을 반환
 *    예: 5 & 3 = 1 (101 & 011 = 001)
 *
 * 2. ^ (XOR 연산자): 두 비트가 다를 때 1을 반환
 *    예: 5 ^ 3 = 6 (101 ^ 011 = 110)
 *
 * 3. << (왼쪽 시프트): 비트를 왼쪽으로 이동 (곱하기 2와 동일)
 *    예: 5 << 1 = 10 (101 << 1 = 1010)
 *
 * 풀이 설명:
 * - 이 알고리즘은 덧셈을 비트 연산으로 구현
 * - XOR(^)로 자리올림 없는 합을 구함
 * - AND(&)로 자리올림을 찾고, 왼쪽 시프트(<<)로 한 자리 올림
 * - 자리올림이 0이 될 때까지 반복
 *
 * 시공간 복잡도:
 * - 시간 복잡도: O(1) - 최악의 경우 32번 반복 (32비트 정수)
 * - 공간 복잡도: O(1) - 상수 공간만 사용
 */

/**
 * @param {number} a
 * @param {number} b
 * @return {number}
 */
var getSum = function (a, b) {
  while (b !== 0) {
    // 자리올림
    let carry = (a & b) << 1;

    // 자리올림 없는 합
    a = a ^ b;

    b = carry;
  }
  return a;
};
