이제 이 시리즈의 마지막 장에 이르렀고, 드디어 비트 조작에 대해 간략하게 살펴보겠습니다.
Wikipedia에서 정의한 대로 비트 연산은 개별 비트 수준에서 비트 문자열, 비트 배열 또는 이진수(비트 문자열로 간주됨)에 대해 작동합니다.
먼저 숫자를 이진수(2진수)로 표현해 보겠습니다. 숫자에 toString 메소드를 사용하고 radix:
를 지정할 수 있습니다.
const n = 17; console.log(n.toString(2)); // 10001
또한 정수를 구문 분석하여 밑수를 제공할 수도 있습니다.
console.log(parseInt(10001, 2)); // 17
접두사 0b를 사용하여 이진수를 나타낼 수도 있습니다.
console.log(0b10001); // 17 console.log(0b101); // 5
예를 들어 다음은 같은 숫자입니다.
0b1 === 0b00000001 // true
모든 비트 연산은 JavaScript의 32비트 이진수에 대해 수행됩니다.
즉, 비트 연산이 수행되기 전에 JavaScript는 숫자를 32비트 **부호 있는* 정수로 변환합니다.*
예를 들어 17은 단순히 10001이 아니라 00000000 00000000 00000000 00010001이 됩니다.
비트 연산이 수행된 후 결과는 다시 64비트 JavaScript 숫자로 변환됩니다.
두 비트가 1이면 결과는 1이고, 그렇지 않으면 0입니다.
Note |
---|
The GIFs below show the numbers as 8-bit strings, but when doing bitwise operations, remember they are converted to 32-bit numbers. |
const n = 17; console.log(n.toString(2)); // 10001
비트 중 하나라도 1이면 결과는 1이고, 그렇지 않으면 0입니다.
console.log(parseInt(10001, 2)); // 17
비트가 다르면(하나는 1이고 다른 하나는 0) 결과는 1이고, 그렇지 않으면 0입니다.
console.log(0b10001); // 17 console.log(0b101); // 5
비트를 뒤집습니다(1은 0이 되고, 0은 1이 됩니다).
0b1 === 0b00000001 // true
Note |
---|
Bitwise NOTing any 32-bit integer x yields -(x 1). |
이진 표현을 보기 위해 도우미 함수를 사용하면 예상한 대로입니다.
const n = 17; console.log(n.toString(2)); // 10001
가장 왼쪽 비트는 숫자가 음수인지 양수인지 신호를 나타냅니다.
JavaScript가 비트 연산에 32비트 부호 있는 정수를 사용한다고 말한 것을 기억하세요.
가장 왼쪽 비트는 음수의 경우 1이고 양수의 경우 0입니다.
또한 연산자는 2의 보수로 피연산자의 비트 표현에 대해 연산을 수행합니다. 각 비트마다 연산자가 적용되어 결과가 비트 단위로 구성됩니다.
2의 보수를 사용하면 역신호가 있는 숫자를 얻을 수 있습니다.
한 가지 방법은 양수 표현의 숫자 비트를 반전하고 1을 더하는 것입니다.
console.log(parseInt(10001, 2)); // 17
주어진 비트 수를 왼쪽으로 이동하고 오른쪽에서 이동한 0비트를 추가합니다.
console.log(0b10001); // 17 console.log(0b101); // 5
32번째 비트(가장 왼쪽 비트)는 버려집니다.
왼쪽에서 비트를 추가할 때 부호를 유지하면서 주어진 비트 수를 오른쪽으로 이동합니다.
0b1 === 0b00000001 // true
const x1 = 0b10001; const x2 = 0b101; const result = x1 & x2; // 1 (0b1)
부호에 관계없이 왼쪽에서 비트를 추가할 때 0을 추가하여 주어진 비트 수를 오른쪽으로 이동합니다.
const x1 = 0b10001; const x2 = 0b101; const result = x1 | x2; // 21 (0b10101)
const x1 = 0b10001; const x2 = 0b101; const result = x1 ^ x2; // 20 (0b10100)
특정 비트를 얻으려면 먼저 비트마스크를 만들어야 합니다.
얻으려는 비트의 인덱스만큼 1을 왼쪽으로 이동하면 됩니다.
결과는 이진수와 비트마스크의 과입니다.
그러나 JavaScript를 사용하면 인덱스를 기준으로 부호 없는 오른쪽 시프트를 수행하여 비트를 첫 번째 위치에 배치할 수도 있습니다(그래서 해당 위치에 있는 실제 값은 얻지 못하지만 1인지 여부는 알 수 없음). 또는 0):
const n = 17; const result = ~n; // -18
예를 들어 이진수로 1101인 13을 시도해 보겠습니다.
console.log(createBinaryString(n)); // -> 00000000 00000000 00000000 00010001 console.log(createBinaryString(result)); // -> 11111111 11111111 11111111 11101110
비트를 1로 바꾸고 싶다면(즉, "비트를 설정") 비슷한 작업을 수행할 수 있습니다.
먼저 1로 설정하려는 비트의 인덱스만큼 1을 왼쪽으로 이동하여 비트마스크를 다시 만들 수 있습니다.
결과는 숫자와 비트마스크의 또는입니다.
function twosComplement(n) { return ~n + 0b1; }
예제 13은 이진수 1101이라는 점을 기억하세요. 인덱스 1에 0을 설정한다고 가정해 보겠습니다.
const n = 17; const result = n << 1; // 34 console.log(createBinaryString(17)); // -> 00000000 00000000 00000000 00010001 console.log(createBinaryString(34)); // -> 00000000 00000000 00000000 00100010
비트 연산과 비트 가져오기/설정에 대해 간략하게 살펴보았습니다. 이 마지막 장에서는 1비트 수부터 시작하여 다섯 가지 문제를 살펴보겠습니다. 그때까지 즐거운 코딩하세요.
위 내용은 LeetCode 명상 — 장 비트 조작의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!