> 웹 프론트엔드 > JS 튜토리얼 > LeetCode 명상 — 장 비트 조작

LeetCode 명상 — 장 비트 조작

Susan Sarandon
풀어 주다: 2024-12-28 14:10:21
원래의
288명이 탐색했습니다.

목차

  • 소개
  • 비트 연산자
    • 그리고(&)
    • 또는(|)
    • XOR(^)
    • 안돼(~)
    • 왼쪽 시프트(제로 채우기)(<<)
    • 오른쪽 시프트(부호 유지)(>>)
    • 오른쪽 시프트(부호 없음) (>>>)
  • 조금씩
  • 조금 설정
  • 리소스


이제 이 시리즈의 마지막 장에 이르렀고, 드디어 비트 조작에 대해 간략하게 살펴보겠습니다.

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.

LeetCode Meditations — Chapter  Bit Manipulation

const n = 17;

console.log(n.toString(2)); // 10001
로그인 후 복사
로그인 후 복사
로그인 후 복사

또는(|)

비트 중 하나라도 1이면 결과는 1이고, 그렇지 않으면 0입니다.

LeetCode Meditations — Chapter  Bit Manipulation

console.log(parseInt(10001, 2)); // 17
로그인 후 복사
로그인 후 복사
로그인 후 복사

XOR(^)

비트가 다르면(하나는 1이고 다른 하나는 0) 결과는 1이고, 그렇지 않으면 0입니다.

LeetCode Meditations — Chapter  Bit Manipulation

console.log(0b10001); // 17
console.log(0b101); // 5
로그인 후 복사
로그인 후 복사
로그인 후 복사

아니다 (~)

비트를 뒤집습니다(1은 0이 되고, 0은 1이 됩니다).

LeetCode Meditations — Chapter  Bit Manipulation

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비트 수부터 시작하여 다섯 가지 문제를 살펴보겠습니다. 그때까지 즐거운 코딩하세요.

자원

  • "JavaScript의 비트 조작을 위한 필수 요소" - Lucas F. Costa
  • JS 비트 연산자
  • 번호(MDN)
  • 비트 AND(MDN)
  • 비트별 NOT(MDN)
  • 비트 OR(MDN)
  • 비트 XOR(MDN)
  • 왼쪽 시프트(MDN)
  • 오른쪽 시프트(MDN)
  • 부호 없는 오른쪽 시프트(MDN)

위 내용은 LeetCode 명상 — 장 비트 조작의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿