분류 javascript

JavaScript 비트 연산자에 대한 흥미로운 사용 사례(2)

컨텐츠 정보

  • 조회 139 (작성일 )

본문

세트 비트 점검 


& 연산자에는 다른 유용한 비트 마스킹 응용 프로그램이 있습니다. 하나의 그러한 응용은 주어진 비트 시퀀스에 대해 하나 이상의 비트가 설정되어 있는지를 판단하는 것이다. 예를 들어, 다섯 번째 비트가 주어진 십진수로 설정되어 있는지 확인하고 싶다고 가정 해보십시오. & 연산자를 사용하여 이를 수행하는 방법은 다음과 같습니다.

  • 먼저 대상 비트 (이 경우 다섯 번째 비트)가 1로 설정되어 있는지 확인하는 데 사용할 비트 마스크를 만듭니다. 비트 마스크의 모든 비트는 대상 위치의 비트를 제외하고 0으로 설정됩니다. 이진 숫자 리터럴을 사용하여 이를 쉽게 수행 할 수 있습니다.


const mask = 0b10000;
  • 그런 다음 10 진수와 비트 마스크를 피연산자로 사용하여 & 연산을 수행하고 결과를 비트 마스크와 비교하십시오. 모든 대상 비트가 10 진수로 설정되면 & 연산의 결과는 비트 마스크와 같습니다. 비트 마스크의 0 비트는 A & 0 = 0이므로 10 진수의 해당 비트를 효과적으로 끕니다.
// 34 => 100010
// (34 & mask) => (100010 & 010000) = 000000
console.log((34 & mask) === mask); // false

// 50 => 110010
// (50 & mask) => (110010 & 010000) = 010000
console.log((50 & mask) === mask); // true

짝수 또는 홀수(Even or odd) 

주어진 10 진수가 짝수인지 홀수인지를 확인하기 위해 10 진수에 대한 세트 비트를 검사 할 때 & 연산자를 사용할 수 있습니다. 이를 달성하기 위해 1이 비트 마스크로 사용됩니다 (첫 번째 비트 또는 가장 오른쪽 비트의 설정 여부를 결정하기 위해).

정수의 경우 최하위 비트 (첫 번째 비트 또는 가장 오른쪽 비트)를 사용하여 숫자가 짝수인지 홀수인지를 결정할 수 있습니다. 최하위 비트가 켜져 있으면 (1로 설정) 숫자가 홀수입니다. 그렇지 않으면 숫자는 짝수입니다.


function isOdd (int) {
  return (int & 1) === 1;
}

function isEven (int) {
  return (int & 1) === 0;
}

console.log(isOdd(34)); // false
console.log(isOdd(-63)); // true
console.log(isEven(-12)); // true
console.log(isEven(199)); // false

유용한 정체성 

다음 연산자로 진행하기 전에 & 연산에 대한 유용한 ID가 있습니다 (부호 있는 32 비트 정수 A).


(A & 0) === 0
(A & ~A) === 0
(A & A) === A
(A & -1) === A

Bitwise OR (|) 


| 연산자는 해당 피연산자의 해당 비트 쌍마다 OR 연산을 수행합니다. | 연산자는 두 비트가 모두 0 인 경우에만 0을 반환합니다. 그렇지 않으면 1을 반환합니다.


한 쌍의 비트에 대해 OR 연산의 가능한 값은 다음과 같습니다.


(0 | 0) === 0
(0 | 1) === 1
(1 | 0) === 1
(1 | 1) === 1

비트 켜기 

비트 마스킹 응용 프로그램에서 | 비트 시퀀스의 특정 비트가 켜져 있는지 확인하기 위해 연산자를 사용할 수 있습니다 (1로 설정). 이것은 주어진 비트 A에 대해 :

  • (A | 0 = A) — 해당 0 비트와 쌍을 이루면 비트가 변경되지 않습니다.
  • (A | 1 = 1) — 비트는 항상 해당 1 비트에 의해 켜집니다.

예를 들어, 8 비트 정수가 있고 모든 짝수 위치 비트 (2, 4, 6, 8)가 켜져 있는지 확인하려고 합니다 (1로 설정). | 연산자를 사용하여 다음을 수행 할 수 있습니다.

  • 먼저 8 비트 정수의 모든 짝수 비트를 켤 수 있는 비트 마스크를 만듭니다. 해당 비트 마스크는 0b10101010입니다. 비트 마스크의 짝수 비트는 1로 설정되고 다른 모든 비트는 0으로 설정됩니다.
  • 다음으로 | 8 비트 정수와 생성 된 비트 마스크를 사용한 연산 :
const mask = 0b10101010;

// 208 => 11010000

// (208 | mask)
// ------------
// 11010000
// | 10101010
// ------------
// = 11111010
// ------------
// = 250 (decimal)

console.log(208 | mask); // 250

유용한 정체성 

다음 운영자로 진행하기 전에 다음과 같은 유용한 정보가 있습니다. | 연산 (부호 있는 32 비트 정수 A) :


(A | 0) === A
(A | ~A) === -1
(A | A) === A
(A | -1) === -1

Bitwise XOR (^) 


^ 연산자는 해당 피연산자의 해당 비트 쌍마다 XOR (배타적 OR) 연산을 수행합니다. ^ 연산자는 두 비트가 모두 같은 경우 0을 반환합니다 (0 또는 1). 그렇지 않으면 1을 반환합니다.


한 쌍의 비트에 대해 XOR 연산의 가능한 값은 다음과 같습니다.


(0 ^ 0) === 0
(0 ^ 1) === 1
(1 ^ 0) === 1
(1 ^ 1) === 0

토글 비트 

비트 마스킹 애플리케이션에서 ^ 연산자는 일반적으로 비트 시퀀스에서 특정 비트를 토글하거나 뒤집는 데 사용됩니다. 이것은 주어진 비트 A에 대해 :

  • 해당 0 비트와 쌍을 이룰 때 비트는 변경되지 않습니다.

(^ 0 = A) 

  • 해당 1 비트와 쌍을 이룰 때 항상 비트가 토글됩니다.

(^ 1 = 1) — if A is 0
(^ 1 = 0) — if A is 1 


예를 들어, 8 비트 정수가 있고 가장 중요하지 않은 (첫 번째) 비트와 가장 중요한 (8 번째) 비트를 제외한 모든 비트가 토글되도록하려고합니다. ^ 연산자를 사용하여 다음을 수행 할 수 있습니다.

  • 먼저, 가장 중요하지 않고 가장 중요한 비트를 제외한 8 비트 정수의 모든 비트를 토글하는 효과를 갖는 비트 마스크를 만듭니다. 해당 비트 마스크는 0b01111110입니다. 토글 될 비트는 1로 설정되고 다른 모든 비트는 0으로 설정됩니다.
  • 다음으로 8 비트 정수와 생성 된 비트 마스크를 사용하여 ^ 연산을 수행하십시오.
const mask = 0b01111110;

// 208 => 11010000

// (208 ^ mask)
// ------------
// 11010000
// ^ 01111110
// ------------
// = 10101110
// ------------
// = 174 (decimal)

console.log(208 ^ mask); // 174

유용한 정체성 

다음 연산자로 진행하기 전에 ^ 연산에 대한 유용한 ID가 있습니다 (부호 있는 32 비트 정수 A).


(A ^ 0) === A
(A ^ ~A) === -1
(A ^ A) === 0
(A ^ -1) === ~A

위에 나열된 ID에서 A와 -1의 XOR 연산이 A의 NOT 연산과 동일하다는 것이 명백합니다. 따라서 foundIndex() 함수는 다음과 같이 작성할 수 있습니다.