ホームページ >ウェブフロントエンド >jsチュートリアル >LeetCode 瞑想 — 章ビット操作
このシリーズの最終章に入り、いよいよビット操作について簡単に見ていきます。
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. |
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 つの方法は、正の表現の数値のビットを反転し、それに 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 つの問題を見ていきます。それまで、コーディングを楽しんでください。
以上がLeetCode 瞑想 — 章ビット操作の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。