ビットシフト演算子 | ビット演算子 | JavaScript 超完全入門 基本から発展までのすべて

スポンサーリンク
スポンサーリンク

ビットシフト演算子とは?

ビットシフト演算子は、数値のビットを左または右にシフトさせる演算子です。JavaScriptでは、3種類のビットシフト演算子が提供されています。これらの演算子を使用することで、ビット単位での操作を効率的に行うことができます。

主なビットシフト演算子

次に、JavaScriptで使用される3つのビットシフト演算子を紹介します。

演算子 説明

<<

(左シフト)

ビットを指定された数だけ左にシフトします。

空いたビットには0が入ります。

5 << 1 → 10

(5は101 → 左に1ビットシフト → 1010 = 10)

>>

(符号付き右シフト)

ビットを指定された数だけ右にシフトします。

符号ビットは保持されます。

-5 >> 1 → -3

(負の数では符号が維持される)

>>>

(符号なし右シフト)

ビットを指定された数だけ右にシフトします。

符号ビットは保持されず、空いたビットには0が入ります。

-5 >>> 1 → 2147483645

(符号が保持されないため大きな正の数になる)

左シフト(<<)の例

左シフトは、ビットを左に移動させ、空いたビットに0を挿入します。シフトされた分だけ数値は2倍になります。

let a = 5;  // 5は2進数で101
console.log(a << 1);  // 10(101 → 1010)

この例では、5(101)を左に1ビットシフトして10(1010)に変わります。左シフトは数値を2倍にするのに使えます。

符号付き右シフト(>>)の例

符号付き右シフトは、ビットを右にシフトさせますが、符号ビット(最左ビット)は保持されます。負の数に対してこの操作を行うと、符号は維持されたままビットがシフトされます。

let b = -5;  // -5は2進数で11111111111111111111111111111011
console.log(b >> 1);  // -3(11111111111111111111111111111101)

この例では、-5を右に1ビットシフトして-3が返されます。符号ビットは保持されているため、負の値が維持されます。

符号なし右シフト(>>>)の例

符号なし右シフトでは、ビットを右にシフトしますが、符号ビットは考慮されず、空いたビットには常に0が入ります。負の数を符号なし右シフトすると、大きな正の数が得られます。

let c = -5;
console.log(c >>> 1);  // 2147483645(符号が保持されない)

この例では、-5を符号なし右シフトして、正の数である2147483645が得られます。符号ビットが維持されないため、このような大きな正の数になります。

ビットシフト演算の応用

ビットシフト演算は、数値を効率的に操作したり、ビットマスクを使って特定のビットを処理する際に役立ちます。たとえば、ビットをシフトすることで、計算を高速化したり、ビット操作でデータを効率的に操作することが可能です。

// 4ビットマスクを使った特定ビットの操作
let flags = 0b1010;  // 2進数で1010
let mask = 0b0001;   // 2進数で0001

console.log(flags & mask);  // 0(1ビット目はオフ)
flags = flags << 1;         // ビットを1つ左にシフト
console.log(flags);         // 10100

この例では、ビットマスクとビットシフトを組み合わせて特定のビットを操作しています。シフトを行うことで、効率的にビットを操作できます。

まとめ

ビットシフト演算子は、ビット単位で数値を操作する際に非常に便利なツールです。左シフト(<<)はビットを左に移動して数値を2倍にし、符号付き右シフト(>>)は符号ビットを維持しながら右にシフトします。符号なし右シフト(>>>)では符号ビットが考慮されず、正の数として扱われます。ビットシフトを使うことで、効率的な計算やビットマスクの操作が可能です。