ビット論理演算とは?
ビット論理演算は、数値のビット(0と1の二進数)単位で論理演算を行う操作です。JavaScriptでは、ビット単位で数値を操作する演算子がいくつか用意されています。ビット論理演算は、通常の論理演算とは異なり、数値を2進数として扱い、そのビットごとに演算を行います。
主要なビット論理演算子
JavaScriptには、次の4つのビット論理演算子があります。それぞれの役割を見ていきましょう。
| 演算子 | 説明 | 例 |
|---|---|---|
& |
ビットごとのAND演算。両方のビットが1のときに1、それ以外は0 | 5 & 3 → 1(5は101、3は011 → 結果は001) |
| |
ビットごとのOR演算。どちらか一方のビットが1であれば1 | 5 | 3 → 7(5は101、3は011 → 結果は111) |
^ |
ビットごとのXOR演算。ビットが異なれば1、同じなら0 | 5 ^ 3 → 6(5は101、3は011 → 結果は110) |
~ |
ビットごとのNOT演算。各ビットを反転させる | ~5 → -6(5は101 → 反転して…010 → -6) |
ビット論理演算の具体例
次に、各ビット論理演算子を使った具体例を見てみましょう。ビット単位での操作がどのように行われるかを確認します。
let a = 5; // 5は2進数で101
let b = 3; // 3は2進数で011
console.log(a & b); // 1(ビットごとのAND演算)
console.log(a | b); // 7(ビットごとのOR演算)
console.log(a ^ b); // 6(ビットごとのXOR演算)
console.log(~a); // -6(ビットごとのNOT演算)
この例では、数値a(5)とb(3)のビット演算を行っています。2進数で考えると、5は101、3は011です。ビット単位でそれぞれの演算を行うと、結果として表示された値が得られます。
AND演算(&)
&は、ビットごとのAND演算を行います。2つのビットが両方とも1である場合に1を返し、それ以外は0を返します。
console.log(5 & 3); // 1(101 & 011 → 001)
OR演算(|)
|は、ビットごとのOR演算を行います。どちらか一方のビットが1であれば1を返します。
console.log(5 | 3); // 7(101 | 011 → 111)
XOR演算(^)
^は、ビットごとのXOR(排他的論理和)演算を行います。2つのビットが異なる場合に1を返し、同じ場合は0を返します。
console.log(5 ^ 3); // 6(101 ^ 011 → 110)
NOT演算(~)
~は、ビットごとのNOT演算を行います。これは、ビットを反転させる操作です。~演算は、正の数を負の数に変換します。
console.log(~5); // -6(101 → 010 → -6)
ビット論理演算の応用
ビット論理演算は、単純な数値操作だけでなく、データのマスク処理やビットフラグの操作など、システムやハードウェアに関わるプログラムでよく使われます。たとえば、特定のビットをオン・オフするためにビットマスクを使用することがあります。
// ビットマスクを使って特定のビットをチェック
let flags = 0b1010; // 2進数で1010
let mask = 0b0010; // 2進数で0010
if (flags & mask) {
console.log("フラグがオンになっています");
} else {
console.log("フラグはオフです");
}
この例では、ビットマスクを使って特定のビットがオンになっているかをチェックしています。ビット演算を使うことで、効率的にフラグの状態を確認できます。
まとめ
JavaScriptにおけるビット論理演算は、数値をビット単位で操作する強力なツールです。ビットごとのAND(&)、OR(|)、XOR(^)、NOT(~)演算を使うことで、低レベルなデータ操作を効率的に行うことができます。特に、ビットマスクやビットフラグの操作など、システムやハードウェア関連のプログラムでよく使用されます。