분류 javascript

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

컨텐츠 정보

  • 조회 210 (작성일 )

본문

JavaScript는 여러 종류의 연산자를 제공하므로 산술 연산, 대입 연산, 논리 연산, 비트 연산 등과 같은 간단한 값에 대한 기본 연산을 수행 할 수 있습니다.


https://blog.logrocket.com/interesting-use-cases-for-javascript-bitwise-operators/ 


우리는 종종 할당 연산자, 산술 연산자 및 논리 연산자가 혼합 된 JavaScript 코드를 봅니다. 그러나 비트 연산자를 많이 사용하지는 않습니다.


JavaScript 비트 연산자 


  1. ~ — Bitwise NOT
  2. & — Bitwise AND
  3. | — Bitwise OR
  4. ^ — Bitwise XOR
  5. << — Left Shift
  6. >> — Sign-Propagating Right Shift
  7. >>> — Zero-Fill Right Shift

이 자습서에서는 모든 JavaScript 비트 연산자를 살펴보고 어떻게 평가되는지 이해하려고 합니다. 간단한 JavaScript 프로그램을 작성할 때 비트 연산자를 위한 몇 가지 흥미로운 응용 프로그램도 살펴 보겠습니다. 이를 위해서는 JavaScript 비트 연산자가 피연산자를 부호 있는 32 비트 정수로 표현하는 방법을 약간 살펴 봐야 합니다.


Bitwise NOT (~) 


~ 연산자는 단항 연산자입니다. 따라서 단 하나의 피연산자가 필요합니다. ~ 연산자는 피연산자의 모든 비트에 대해 NOT 연산을 수행합니다. NOT 연산의 결과를 보완이라고 합니다. 정수의 보수는 정수의 모든 비트를 반전 시켜 형성됩니다.


주어진 정수 (예 : 170)에 대해 다음과 같이 ~ 연산자를 사용하여 보수를 계산할 수 있습니다.


// 170 => 00000000000000000000000010101010
// --------------------------------------
//  ~ 00000000000000000000000010101010
// --------------------------------------
//  = 11111111111111111111111101010101
// --------------------------------------
//  = -171 (decimal)

console.log(~170); // -171

JavaScript 비트 연산자는 피연산자를 2의 보수 형식으로 부호 있는 32 비트 정수로 변환합니다. 

따라서 ~ 연산자가 정수에 사용될 때 결과 값은 정수의 2의 보수입니다. 정수 A의 2의 보수는-(A + 1)로 제공됩니다.


~170 => -(170 + 1) => -171

다음은 JavaScript 비트 연산자가 사용하는 32 비트 부호 있는 정수에 대한 몇 가지 사항입니다.

  • 가장 중요한 (가장 왼쪽) 비트를 부호 비트라고 합니다. 부호 비트는 양의 정수의 경우 항상 0이고 음의 정수의 경우 1입니다.
  • 부호 비트 외에 나머지 31 비트는 정수를 나타내는 데 사용됩니다. 따라서 표시 할 수 있는 최대 32 비트 정수는 (2 ^ 32-1) (2147483647)이고 최소 정수는-(2 ^ 31), -2147483648입니다.
  • 32 비트 부호 있는 정수 범위를 벗어나는 정수의 경우 정수가 범위 내에 속할 때까지 최상위 비트가 삭제됩니다.

다음은 몇 가지 중요한 숫자의 32 비트 시퀀스 표현입니다.


           0 => 00000000000000000000000000000000
          -1 => 11111111111111111111111111111111
  2147483647 => 01111111111111111111111111111111
 -2147483648 => 10000000000000000000000000000000

위의 표현에서 다음과 같이 분명합니다.


          ~0 => -1
         ~-1 => 0
 ~2147483647 => -2147483648
~-2147483648 => 2147483647

발견 된 색인 


배열 및 문자열과 같은 대부분의 JavaScript 내장 객체에는 배열의 항목 또는 문자열 내의 하위 문자열이 있는지 확인하는 데 사용할 수 있는 유용한 메소드가 있습니다. 이러한 방법 중 일부는 다음과 같습니다.


  • Array.indexOf()
  • Array.lastIndexOf()
  • Array.findIndex()
  • String.indexOf()
  • String.lastIndexOf()
  • String.search()


이러한 메소드는 모두 항목 또는 하위 문자열이 있는 경우 인덱스 (0부터 시작)를 반환합니다. 그렇지 않으면 -1을 반환합니다. 예 : 


const numbers = [1, 3, 5, 7, 9];

console.log(numbers.indexOf(5)); // 2
console.log(numbers.indexOf(8)); // -1

찾은 항목 또는 하위 문자열의 색인에 관심이 없으면 대신 부울 값을 사용하여 항목 또는 하위 문자열을 찾을 수 없는 경우 -1이 false가 되고 다른 모든 값이 true가 되도록 선택할 수 있습니다. 그 모습은 다음과 같습니다.


function foundIndex (index) {
  return Boolean(~index);
}

위의 코드 스니펫에서-연산자는 -1에 사용될 때 0으로 평가되며 이는 잘못된 값입니다. 따라서 Boolean()을 사용하여 잘못된 값을 부울로 캐스팅하면 false가 반환됩니다. 다른 모든 인덱스 값에 대해 true가 반환 됩니다. 따라서 이전 코드 스니펫은 다음과 같이 수정할 수 있습니다.


const numbers = [1, 3, 5, 7, 9];

console.log(foundIndex(numbers.indexOf(5))); // true
console.log(foundIndex(numbers.indexOf(8))); // false

Bitwise AND (&) 


& 연산자는 해당 피연산자의 해당 비트 쌍마다 AND 연산을 수행합니다. & 연산자는 두 비트가 모두 1 인 경우에만 1을 반환합니다. 그렇지 않으면 0을 반환합니다. 따라서 AND 연산의 결과는 각 쌍의 해당 비트를 곱하는 것과 같습니다.


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


(0 & 0) === 0     // 0 x 0 = 0
(0 & 1) === 0     // 0 x 1 = 0
(1 & 0) === 0     // 1 x 0 = 0
(1 & 1) === 1     // 1 x 1 = 1

비트 끄기 


& 연산자는 비트 마스킹 응용 프로그램에서 일반적으로 사용되어 특정 비트 시퀀스에 대해 특정 비트가 해제되도록 합니다. 이것은 비트 A에 대해 다음과 같은 사실에 근거합니다.

  • (A & 0 = 0) — 비트는 항상 해당 0 비트에 의해 꺼집니다.
  • (A & 1 = A) — 해당 1 비트와 쌍을 이룰 때 비트는 변경되지 않습니다.

예를 들어 8 비트 정수가 있고 처음 4 비트가 꺼져 있는지 (0으로 설정) 확인하려고 합니다. & 연산자를 사용하여 다음을 수행 할 수 있습니다.

  • 먼저 8 비트 정수의 처음 4 비트를 끄는 효과를 갖는 비트 마스크를 만듭니다. 해당 비트 마스크는 0b11110000입니다. 비트 마스크의 처음 4 비트는 0으로 설정되고 다른 모든 비트는 1로 설정됩니다.
  • 다음으로 8 비트 정수와 생성 된 비트 마스크를 사용하여 & 연산을 수행하십시오.
const mask = 0b11110000;

// 222 => 11011110

// (222 & mask)
// ------------
// 11011110
// & 11110000
// ------------
// = 11010000
// ------------
// = 208 (decimal)

console.log(222 & mask); // 208