자바스크립트(JavaScript): 비트 연산자 (Bit Operator)

비트 연산자란 2진수(binary)를 연산할 때 사용하는 연산자입니다.

예를 들어 십진법으로 표기한 정수 70을 이진법 표기로 변환하면

1000110B 가 되는데, 이 이진법으로 변환된 값을 기준으로 연산을 수행하는 연산자가 비트 연산자입니다.

이하 별도의 표기법이 없는 경우는 전부 십진법 숫자이며, 이진법은 (이진법: 숫자) 또는 숫자 뒤에 B가 붙어 있습니다.

 

1: AND( & ) 연산

AND 연산은 두 개의 숫자(값이)를 각 비트마다 AND 연산합니다. AND 연산은 곱연산으로 두 비트가 모두 1일 경우에만 1를 반환하며, 두 비트 중 하나라도 0이라면 0를 반환합니다.

  • 1 & 1 = 1
  • 1 & 0 = 0
  • 0 & 1 = 0
  • 0 & 0 = 0

 

70(1000110B)54(110110B)AND 연산을 수행해 보겠습니다.

console.log(70 & 54)
// 결과: 6

6(110B)이 나올까요? 70과 60을 이진법으로 변환시킨 뒤 계산해보면 이해할 수 있습니다.

위 표처럼 십진법을 이진법으로 변환시킨 뒤, 각 자릿수마다 AND 연산을 한 뒤 나온 비트들을 다시 십진법 표기로 변환하면 6이 나오는 것을 알 수 있습니다.

 

예제: 특정 자리의 비트수가 1인지 확인

AND 연산은 양쪽 모두가 1인 경우 외에는 전부 0을 반환합니다. 이 속성을 이용해 숫자의 어떤 자리수가 1인지 여부를 확인할 수 있습니다.

204(11001100B)의 각 자릿수가 1인지 확인하기

for(let i = 0; i < 8 ; i++) {
    const digit = (8 - 1) - i
    const powed = Math.pow(2, digit)
    console.log(digit, (powed & 204) != 0)
}

 

2042^7 = 128(1000 0000B)AND 연산하면 맨 앞의 1을 제외하고는 공통되는 비트가 없으므로 나머지는 전부 0이 됩니다. 따라서 204 & 128의 연산 결과는 128(1000 0000B)이 됩니다.

2042^5 = 32(0010 0000B)AND 연산하면 공통되는 부분이 하나도 없으므로 연산 결과는 0이 됩니다.

위의 패턴으로 볼 때 각 자리값마다 연산 결과가 0이 아닌 경우 해당 자릿수는 1이므로 true, 아니라면 false를 반환합니다.

비트 필드 또는 비트 플래그라 불리는 데이터 저장 기법이 있는데, 비트 필드를 사용할 때 체크 여부를 이러한 AND 연산으로 판별합니다.

 

2: OR( | ) 연산

OR 연산은 두 개의 숫자를 각 비트마다 OR 연산합니다. OR 연산은 합연산으로 두 비트 중  하나라도 1일 경우에는 1를 반환하며, 두 비트가 모두 0인 경우에만 0를 반환합니다.

  • 1 | 1 = 1
  • 1 | 0 = 1
  • 0 | 1 = 1
  • 0 | 0 = 0

 

70(1000110B)54(110110B)OR 연산을 수행해 보겠습니다.

console.log(70 | 54) 
// 결과: 118

AND 연산과 달리 118(111 0110B)이 나오는 이유는 아래 그림을 보면 알 수 있습니다.

 

3: XOR( ^ ) 연산 – Exclusive OR

두 비트의 값이 같은 경우 0를 반환하며, 두 비트값이 다른 경우에는 1를 반환합니다.

참고로 두 값을 더한 뒤 mod(%) 2를 했을때의 값과 동일합니다.

  • 1 ^ 1 = 0
  • 1 ^ 0 = 1
  • 0 ^ 1 = 1
  • 0 ^ 0 = 0

 

70(1000110B)54(110110B)XOR 연산을 수행해 보겠습니다.

console.log(70 ^ 54) 
// 결과: 112

70 ^ 54 = 112 (111 0000B)

 

4: NOT( ~ ) 연산

NOT 연산은 10으로, 01로 반전시킵니다.

자바스크립트 내에서 음수의 비트 표기법에 의해 NOT 연산자를 수행하면 해당 양수/음수 부호와 반대되는 값이 나옵니다.

모질라 문서 Bitwise NOT (~) 참고

 

5: 왼쪽(<<) / 오른쪽(>>) SHIFT 연산

왼쪽 SHIFT (<<) 연산자는 모든 비트를 왼쪽으로 x 칸씩 이동시킵니다. 이동 범위를 초과하는 값은 버려지고, 새로 생긴 빈 칸은 0으로 채워집니다.

 

아래 코드는 70(1000110B)의 모든 비트를 왼쪽으로 2칸씩 이동하라는 의미로, 결과는 280(1 0001 1000B)이 나옵니다. 왼쪽으로 2칸씩 이동하면서 새로 생긴 끝의 2자리는 0으로 채워집니다.

console.log(70 << 2) 
// 결과: 280

 

오른쪽 SHIFT (>>) 연산자는 모든 비트를 오른쪽으로 x 칸씩 이동시킵니다. 이동 범위를 초과하는 부분은 버려집니다.

 

아래 코드는 70(1000110B)의 모든 비트를 오른쪽으로 2칸씩 이동하라는 의미로, 결과는 17(10001B)이 나옵니다.오른쪽으로 2칸씩 이동하면서 맨 끝자리 2개의 비트는 버려집니다..

console.log(70 >> 2) 
// 결과: 17

문의 | 코멘트 또는 yoonbumtae@gmail.com


카테고리: WEB: Frontend


0개의 댓글

답글 남기기

Avatar placeholder

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다