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);
}