JavaScript 비트 연산자

비트 연산자

연산자 이름 설명
& AND 두 비트가 모두 1인 경우 비트를 1로 설정합니다.
| OR 두 비트 중 하나가 1인 경우 비트를 1로 설정합니다.
^ XOR 두 비트 중 하나만 1인 경우 비트를 1로 설정합니다.
~ NOT 모든 비트를 반전시킵니다.
<< 왼쪽 shift 오른쪽에서 0을 푸쉬하고 왼쪽으로 이동하고 가장 왼쪽 비트가 떨어지도록 합니다.
>> 오른쪽 shift 왼쪽에서 가장 왼쪽 비트의 복사본을 푸쉬하고 오른쪽으로 이동하고 가장 오른쪽 비트가 떨어지도록 합니다.
>>> 오른쪽 shift 왼쪽에서 0을 푸쉬하고 오른쪽으로 이동하고 가장 오른쪽 비트가 떨어지도록 합니다.

예시

연산자 결과 같은 식 결과
5 & 1 1 0101 & 0001 0001
5 | 1 5 0101 | 0001 0101
~ 5 10 ~0101 1010
5 << 1 10 0101 << 1 1010
5 ^ 1 4 0101 ^ 0001 0100
5 >> 1 2 0101 >> 1 0010
5 >>> 1 2 0101 >>> 1 0010

32비트 비트 피연산자

자바스크립트는 64비트 부동소수점 숫자로 숫자를 저장하지만 모든 비트 연산은 32비트 이진수에서 수행됩니다.

비트 연산이 수행되기 전에 자바스크립트는 숫자를 32비트 부호 있는 정수로 변환합니다.

비트 단위 작업이 수행된 후 결과는 다시 64비트 자바스크립트 번호로 변환됩니다.

위의 예에서는 4비트의 부호 없는 이진수를 사용합니다. 이 때문에 ~ 5는 10을 반환합니다.
자바스크립트는 32비트 부호 있는 정수를 사용하기 때문에 10을 반환하지 않습니다. -6이 반환됩니다.
00000000000000000000000000000101 (5)
11111111111111111111111111111010 (~5 = -6)
부호 있는 정수는 맨 왼쪽 비트를 빼기 기호로 사용합니다.

비트 AND

비트 쌍에 대해 비트 AND가 수행되면 두 비트가 모두 1이면 1을 반환합니다.

1bit 예시 :

연산자 결과
0 & 0 0
0 & 1 0
1 & 0 0
1 & 1 1

4bit 예시 :

연산자 결과
1111 & 0000 0000
1111 & 0001 0001
1111 & 0010 0010
1111 & 0100 0100

비트 OR

비트 쌍에 대해 비트 OR이 수행될 때 비트 중 하나가 1이면 1을 반환합니다.

1bit 예시 :

연산자 결과
0 | 0 0
0 | 1 1
1 | 0 1
1 | 1 1

4bit 예시 :

연산자 결과
1111 | 0000 1111
1111 | 0001 1111
1111 | 0010 1111
1111 | 0100 1111

비트 XOR

비트 쌍에 대해 비트별 XOR이 수행되면 비트가 다르면 1을 반환합니다.

1bit 예시 :

연산자 결과
0 ^ 0 0
0 ^ 1 1
1 ^ 0 1
1 ^ 1 0

4bit 예시 :

연산자 결과
1111 ^ 0000 1111
1111 ^ 0001 1110
1111 ^ 0010 1101
1111 ^ 0100 1011

AND 연산자 (&)

비트 AND는 두 비트가 모두 1인 경우에만 1을 반환합니다.

10진수 2진수
5 00000000000000000000000000000101
1 00000000000000000000000000000001
5 & 1 00000000000000000000000000000001 (1)
예제 1
let x = 5 & 1;

OR 연산자 (|)

비트 중 하나가 1이면 비트 OR이 1을 반환합니다.

10진수 2진수
5 00000000000000000000000000000101
1 00000000000000000000000000000001
5 | 1 00000000000000000000000000000101 (5)
예제 2
let x = 5 | 1;

XOR 연산자 (^)

비트별 XOR은 비트가 다를 경우 1을 반환합니다.

10진수 2진수
5 00000000000000000000000000000101
1 00000000000000000000000000000001
5 ^ 1 00000000000000000000000000000100 (4)
예제 3
let x = 5 ^ 1;

NOT 연산자 (~)

10진수 2진수
5 00000000000000000000000000000101
~5 11111111111111111111111111111010 (-6)
예제 4
let x = ~5;

0 채우기 왼쪽 Shift (<<)

하나 이상의 0비트가 오른쪽에서 밀어넣어지고 가장 왼쪽 비트가 떨어집니다.

10진수 2진수
5 00000000000000000000000000000101
5 << 1 00000000000000000000000000001010 (10)
예제 5
let x = 5 << 1;

부호 유지 오른쪽 Shift (>>)

맨 왼쪽 비트의 복사본은 왼쪽에서 밀어넣어지고 맨 오른쪽 비트는 떨어집니다.

10진수 2진수
-5 11111111111111111111111111111011
-5 >> 1 11111111111111111111111111111101 (-3)
예제 6
let x = -5 >> 1;

0 채우기 오른쪽 Shift (>>>)

하나 이상의 0비트가 왼쪽에서 밀려들어오고 가장 오른쪽 비트가 떨어집니다.

10진수 2진수
5 00000000000000000000000000000101
5 >>> 1 00000000000000000000000000000010 (2)
예제 7
let x = 5 >>> 1;

2진수

비트 집합이 하나만 있는 이진수는 이해하기 쉽다.

2진수 값 10진수 값
00000000000000000000000000000001 1
00000000000000000000000000000010 2
00000000000000000000000000000100 4
00000000000000000000000000001000 8
00000000000000000000000000010000 16
00000000000000000000000000100000 32
00000000000000000000000001000000 64

몇 비트를 더 설정하면 이진 패턴이 나타납니다.

2진수 값 10진수 값
00000000000000000000000000000101 5 (4 + 1)
00000000000000000000000000001101 13 (8 + 4 + 1)
00000000000000000000000000101101 45 (32 + 8 + 4 + 1)

자바스크립트 2진수는 2의 보수 형식으로 저장됩니다.

2진수 값 10진수 값
00000000000000000000000000000101 5
11111111111111111111111111111011 -5
00000000000000000000000000000110 6
11111111111111111111111111111010 -6
00000000000000000000000000101000 40
11111111111111111111111111011000 -40

10진수를 2진수로 변환

예제 8
function dec2bin(dec){
  return (dec >>> 0).toString(2);
}

2진수를 10진수로 변환

function bin2dec(bin){
  return parseInt(bin, 2).toString(10);
}