수색…


비트 연산자

비트 연산자는 데이터의 비트 값에 대한 연산을 수행합니다. 이 연산자는 피연산자를 2의 보수 로 부호있는 32 비트 정수로 변환합니다.

32 비트 정수로 변환

32 비트 이상인 숫자는 최상위 비트를 무시합니다. 예를 들어 32 비트를 초과하는 다음 정수는 32 비트 정수로 변환됩니다.

Before: 10100110111110100000000010000011110001000001
After:              10100000000010000011110001000001

2의 보수

정상적인 이진수에서 2의 거듭 제곱으로 위치를 기반으로 1 을 더함으로써 이진 값을 찾습니다. 가장 오른쪽 비트는 2^0 이고 가장 왼쪽 비트는 2^n-1 여기서 n 은 비트 수입니다. 예를 들어, 4 비트 사용 :

// Normal Binary
// 8 4 2 1
   0 1 1 0  => 0 + 4 + 2 + 0 => 6

두 가지 보완 형식은 숫자의 음수 (6 ~ 6)가 반전 된 숫자에 +1 비트를 더한 비트를 의미합니다. 6의 거꾸로 된 비트는 다음과 같습니다.

// Normal binary
   0 1 1 0
// One's complement (all bits inverted)
   1 0 0 1  => -8 + 0 + 0 + 1 => -7
// Two's complement (add 1 to one's complement)
   1 0 1 0  => -8 + 0 + 2 + 0 => -6

참고 : 2 진수의 왼쪽에 1 더 추가해도 2의 값이 변경되지 않습니다. 값 10101111111111010 은 모두 -6 입니다.

비트 AND

비트 AND 연산 a & b 는 이진 값을 1 로 반환합니다. 여기서 이진 연산자는 모두 1 특정 위치에, 0 을 다른 모든 위치에 갖습니다. 예 :

13 & 7 => 5
// 13:     0..01101
//  7:     0..00111
//-----------------
//  5:     0..00101 (0 + 0 + 4 + 0 + 1)

현실 세계의 예 : 숫자의 패리티 체크

이 "걸작"대신 (불행히도 많은 실제 코드 부분에서 너무 자주 볼 수 있음) :

function isEven(n) {
    return n % 2 == 0;
}

function isOdd(n) {
    if (isEven(n)) {
        return false;
    } else {
        return true;
    }
}

(정수) 숫자의 패리티를 훨씬 더 효과적이고 간단한 방식으로 확인할 수 있습니다.

if(n & 1) {
    console.log("ODD!");
} else {
    console.log("EVEN!");
}

비트 OR

비트 OR 연산 a | b A의 이진 값을 반환 1 오퍼랜드 또는 두 피연산자 중 하나가이 1 의 특정 위치에서 년대, 그리고 0 값 모두가있을 때 0 되는 위치이다. 예 :

13 | 7 => 15
// 13:     0..01101
//  7:     0..00111
//-----------------
// 15:     0..01111 (0 + 8 + 4 + 2 + 1)  

비트 NOT

비트 단위는 NOT 연산은 ~a 주어진 값의 비트 플립 a . 이것은 모든 10 이되고 모든 01 이 될 것임을 의미합니다.

~13 => -14
// 13:     0..01101
//-----------------
//-14:     1..10010 (-16 + 0 + 0 + 2 + 0)

비트 XOR

비트 XOR ( 배타적 논리합 연산) a ^ b 는 두 비트가 다른 경우에만 1 배치합니다. 배타적이거나 또는 둘 중 하나를 의미 하나 둘 다를 의미 하지는 않습니다 .

13 ^ 7 => 10
// 13:     0..01101
//  7:     0..00111
//-----------------
// 10:     0..01010  (0 + 8 + 0 + 2 + 0)

실제 예 : 추가 메모리 할당없이 두 정수 값 스와핑

var a = 11, b = 22;
a = a ^ b;
b = a ^ b;
a = a ^ b;
console.log("a = " + a + "; b = " + b);// a is now 22 and b is now 11

시프트 연산자

비트 단위 시프 팅은 비트를 왼쪽 또는 오른쪽으로 "이동"하는 것으로 생각할 수 있으므로 작동되는 데이터의 값을 변경합니다.

왼쪽 시프트

왼쪽 시프트 연산자 (value) << (shift amount)(shift amount) 비트 (shift amount) 비트를 왼쪽으로 (shift amount) . 오른쪽에서 오는 새로운 비트는 0 이됩니다.

5 << 2 => 20
//  5:      0..000101
// 20:      0..010100 <= adds two 0's to the right

오른쪽 시프트 ( 부호 전파 )

오른쪽 시프트 연산자 (value) >> (shift amount) 는 초기 피연산자의 부호를 유지하기 때문에 "부호 전파 오른쪽 시프트"라고도합니다. 오른쪽 시프트 연산자는 시프트 value 지정된 shift amount 오른쪽 비트를. 오른쪽에서 벗어난 초과 비트는 무시됩니다. 왼쪽에서 오는 새로운 비트는 초기 피연산자의 부호를 기반으로합니다. 가장 왼쪽의 비트가 1 경우, 새로운 비트는 모두 1 , 그 반대의 경우는 0 됩니다.

20 >> 2 => 5
// 20:      0..010100
//  5:      0..000101 <= added two 0's from the left and chopped off 00 from the right

-5 >> 3 => -1
// -5:      1..111011
// -2:      1..111111 <= added three 1's from the left and chopped off 011 from the right

오른쪽 시프트 ( 제로 채우기 )

0으로 채우는 오른쪽 시프트 연산자 (value) >>> (shift amount) 는 비트를 오른쪽으로 이동시키고 새 비트는 0 이됩니다. 0 은 왼쪽에서부터 시프트되고, 오른쪽으로 초과 된 비트는 쉬프트되고 버려집니다. 이는 음수를 양수로 만들 수 있음을 의미합니다.

-30 >>> 2 => 1073741816
//       -30:      111..1100010
//1073741816:      001..1111000

Zero-fill right shift와 sign-propagating right shift는 음수가 아닌 경우에도 동일한 결과를 산출합니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow