JavaScript 비트연산자 XOR(^)

Robin·2023년 1월 18일
0

JavaScript 알고리즘

목록 보기
9/9

코딩테스트를 회고하던 중, 더 효율적인 문제풀이 방식이 있지 않은 마음에 구글링을 해봤다.

단순히 나처럼 경우에 따라서 if-else if문으로 처리한 경우 외에도 XOR^ 을 사용하는 방법을 확인 할 수 있었다.

너무나도 코드가 간결해지기에 vscode에서 여러가지 시도를 해봤다.

XOR(^)

초반에 검색한 바에 따르면 아래와 같다:

  • a ^ b의 경우, a와 b가 다르면 1을 리턴하고, 같으면 0을 리턴한다.
  • a ^ b ^ c의 경우, 세 값 중 두 개가 같고 나머지 하나가 다를 경우 그 다른 값을 반환한다.

Case1: 세 값이 모두 다른 경우

let a = 1;
let b = 2;
let c = 3;

let result = a ^ b ^ c;

console.log(result); // 0

혹은,

let a = 1;
let b = 5;
let c = 6;

let result = a ^ b ^ c;

console.log(result); // 2

Case2. 세값 중 하나만 다른 경우: 그 다른 값

let a = 1;
let b = 1;
let c = 3;

let result = a ^ b ^ c;

console.log(result); // 3

Case3. 세값이 모두 같은 경우: 같은 값

let a = 1;
let b = 1;
let c = 1;

let result = a ^ b ^ c;

console.log(result); // 1

파악

가지각색 이다. 이해가 되지 않는다.
'0과 1로만 나와야 하는것 아닌가?' 하는 의문이 들었다.

MDN 서칭을 진행한 결과 답을 얻을 수 있었다.

The operands are converted to 32-bit integers and expressed by a series of bits (zeroes and ones).
...
Each bit in the first operand is paired with the corresponding bit in the second operand: first bit to first bit, second bit to second bit, and so on.

MDN에서 제시하는 예시를 보면 이해가 쉽다:

const a = 5;        // 00000000000000000000000000000101
const b = 3;        // 00000000000000000000000000000011

console.log(a ^ b); // 00000000000000000000000000000110
// Expected output: 6

즉,
1. 피연산자를 32비트로 전환
2. 각각의 비트를 비교 대조하며 다르면 1, 같으면 0을 그 자리수에 갖는 32비트를 만든다.
(위의 예시에서는 a(5)의 첫번째 자리비트와 b(3)의 첫번째 자리비트 비교하고 -> 두번째 자리비트 -> ...)

이에 위의 예시에서의 끝 세자리만 확인해보면:

101
011
⬇️
110

이와 같이 각 자리수를 대조하여 새로운 32비트를 구성하는 0과 1을 생성한 것이 확인된다.
이러니 값이 다 가지각색으로 나오지!

깨달은 점: (1) 공식문서 보자 (2) 따라쓰지 말고 알고쓰자

profile
Always testing, sometimes dog walking

0개의 댓글

관련 채용 정보