LeetCode 瞑想 — 章ビット操作

Susan Sarandon
Susan Sarandonオリジナル
2024-12-28 14:10:21316ブラウズ

目次

  • はじめに
  • ビット演算子
    • そして (&)
    • または (|)
    • XOR (^)
    • そうではありません (~)
    • 左シフト (ゼロフィル) (<<)
    • 右シフト (符号保持) (>>)
    • 右シフト (符号なし) (>>>)
  • 少しずつ進んでいきます
  • ちょっとした設定
  • リソース


このシリーズの最終章に入り、いよいよビット操作について簡単に見ていきます。

Wikipedia の定義によれば、ビット単位の演算は、ビット文字列、ビット配列、または 2 進数 (ビット文字列と見なされます) を個々のビットのレベルで操作します。


まず数値を 2 進数 (基数 2) で表してみましょう。数値に対して toString メソッドを使用し、radix:
を指定できます。

const n = 17;

console.log(n.toString(2)); // 10001

基数を指定して整数を解析することもできます。

console.log(parseInt(10001, 2)); // 17

接頭辞 0b を付けて 2 進数を表すこともできることに注意してください:

console.log(0b10001); // 17
console.log(0b101); // 5

たとえば、これらは同じ番号です:

0b1 === 0b00000001 // true

JavaScript では、すべてのビット単位の演算が 32 ビット 2 進数に対して実行されます。
つまり、ビット単位の演算が実行される前に、JavaScript は数値を 32 ビット **符号付き* 整数に変換します。*

つまり、たとえば、17 は単に 10001 ではなく、00000000 00000000 00000000 00010001 になります。

ビット単位の演算が実行された後、結果は 64 ビット JavaScript 数値に変換されます。

ビット演算子

そして (&)

2 つのビットが 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 つの方法は、正の表現の数値のビットを反転し、それに 1 を加算することです。

console.log(parseInt(10001, 2)); // 17

左シフト (ゼロ埋め) (<<)

指定されたビット数を左にシフトし、右からシフトインされたゼロ ビットを追加します。

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 左にシフトします。
結果は、2 進数とビットマスクの です。

ただし、JavaScript を使用すると、インデックスによって符号なしの右シフトを実行してビットを最初の場所に配置することもできます (その位置にある実際の値は取得しませんが、それが 1 であるかどうかは取得しません)または 0):

const n = 17;

const result = ~n; // -18

たとえば、13 を試してみましょう。これは 2 進数で 1101 です。

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 ビットの数」から始まる 5 つの問題を見ていきます。それまで、コーディングを楽しんでください。

リソース

  • 「JavaScript におけるビット操作の絶対必需品」 - Lucas F. Costa
  • JS ビット演算子
  • 番号 (MDN)
  • ビットごとの AND (MDN)
  • ビットごとの NOT (MDN)
  • ビットごとの OR (MDN)
  • ビットごとの XOR (MDN)
  • 左シフト (MDN)
  • 右シフト (MDN)
  • 符号なし右シフト (MDN)

以上がLeetCode 瞑想 — 章ビット操作の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。