JS: 비트 연산자와 2의 보수

Yul Kang·2023년 4월 20일
0

JS

목록 보기
3/4

& (Bitwise AND)

  • 두 개의 비트가 모두 1 이라면 1 을 리턴하고 그렇지 않다면, 0 을 리턴합니다.
let bitAnd = 12 & 15;
// 1100 (12)
// 1111 (15)
// 1100 (12)
console.log(bitAnd); // 12

| (Bitwise OR)

  • 두 개의 비트 중 하나라도 1 이라면 1 을 리턴하고, 그렇지 않다면 0 을 리턴합니다.
let bitOR = 12 | 15;
// 1100 (12)
// 1111 (15)
// 1111 (15)
console.log(bitOR); // 15

~ (Bitwise NOT)

  • Unary Operator로, 피연산자가 하나인 연산자입니다.
  • 피연산자의 모든 비트를 반전시킵니다.
let bitNOT = ~3;
// 0011 (3)
// 1100 (-4)
console.log(bitNOT); // -4

^ (Bitwise XOR)

  • 두 개의 비트가 같으면 0 을 리턴하고, 다르면 1 을 리턴합니다.
let bitXOR = 12 ^ 15;
// 1100 (12)
// 1111 (15)
// 0011 (3)
console.log(bitXOR); // 3

<< (Left Shift)

  • 오른쪽 피연산자만큼 비트 전체를 왼쪽으로 이동합니다.
let leftShift = 7 << 2;
// 0000 0111 (7)
// 0001 1100 (28)
console.log(leftShift); // 28

>> (Right Shift)

  • 오른쪽 피연산자만큼 비트 전체를 오른쪽으로 이동합니다.
let rightShift = 7 >> 1;
// 0000 0111 (7)
// 0000 0011 (3)
console.log(rightShift); // 3

2의 보수: 컴퓨터가 음수를 표현하는 방법

  • 컴퓨터에서는 양수와 음수를 구분하기 위해 최상위 비트 (Most Significant Bit)를 부호 비트로 사용한다.
// 0001 (1)
// 1001 (-1)

이 방식에는 큰 문제점이 있는데, 바로 2진수의 연산이 불편하다는 점이다.

// 0001 + 1001 = 1010 (0)

연산상으로는 1010이 0000이 되어야하지만, 그렇지 않다.

  • 그래서 나온 것이 1의 보수라는 개념이다.

~ 연산자가 하는 방식이 바로 1의 보수와 동일하다.

// 0001 (1)
// 1110 (-1)

이 방법 또한 하나의 단점이 존재하는 데, 바로 0이 두 가지 방식으로 표현된다는 것이다.

// 0001 + 1110 = 1111 (0)
// 0000 (0) 
// 1111 (0)

그래서 앞선 두 가지 방식을 해결하기 위해 2의 보수가 등장한다

2의 보수: 양수의 1의 보수를 구한 뒤, 1을 더해주는 방식

// 0001 (1)
// 1111 (-1)
  • 다시 계산해 보면
// 0001 + 1111 = 10000

위의 결과가 나오는데, 위 값의 최상위 비트가 1이지만 범위를 벗어났기 때문에 무시하여 10000 => 0000 => 0이 되는 것을 확인할 수 있다.

비트 조작 (Bit Manipulation)

isEven: 홀수, 짝수 구분하기

function isEven(num) {
	return !(num & 1); 
  	// 0000 0111 (7)
    // 0000 0001 (1)
}

isEven(2) // true
isEven(7) // false

isPositive: 음수, 양수 구분하기

function isPositive(num) {
  	return !((num >> 31) & 1);
}

switchSign: 부호 변환하기

function switchSign(num) {
	return ~num + 1;
}

0개의 댓글