ビット演算とは、数値を2進数のビット列として見て、各ビットに対して行う演算です。
一言でいうと
ビット演算は、数値を0と1の並びとして扱い、特定のビットが立っているか、特定の範囲だけ取り出す時に使います。
代表的な演算子
| 演算子 | 名前 | 例 |
|---|---|---|
& | AND | 両方が1のビットだけ1 |
| | OR | どちらかが1なら1 |
^ | XOR | 片方だけ1なら1 |
~ | NOT | 0と1を反転 |
<< | 左シフト | 左へビットをずらす |
>> | 符号付き右シフト | 右へビットをずらす |
>>> | 符号なし右シフト | 0埋めで右へずらす |
ANDでビットを取り出す
& は、特定のビットだけを見る時によく使います。
const value = 0b10101100;
const mask = 0b00001111;
console.log((value & mask).toString(2)); // 1100
このように、マスクを使って必要な部分だけを残せます。
文字コード判定での例
ASCII範囲かどうかを見る例です。
function isAsciiCode(code) {
return (code & 0xff80) === 0;
}
console.log(isAsciiCode("A".charCodeAt(0))); // true
console.log(isAsciiCode("あ".charCodeAt(0))); // false
ただし、可読性のためには次のような範囲比較の方が読みやすいことも多いです。
function isAsciiCodeReadable(code) {
return code >= 0x00 && code <= 0x7f;
}
シフト演算
シフト演算は、ビットを左右へずらします。
console.log(1 << 3); // 8
console.log(8 >> 1); // 4
左へ1つずらすと、おおむね2倍になります。右へ1つずらすと、おおむね半分になります。ただし、符号や32ビット整数変換に注意が必要です。
JavaScriptでの注意
JavaScriptの数値は通常Numberですが、ビット演算では32ビット整数として扱われます。
console.log(0xffffffff | 0); // -1
大きな数値や符号を扱う時は、意図しない結果になることがあります。
JavaScriptのビット演算は32ビット整数に変換されるため、大きな数値処理では注意します。
使う場面
| 場面 | 例 |
|---|---|
| フラグ管理 | 権限や状態をビットで持つ |
| 低レベル処理 | バイナリデータを読む |
| 色の分解 | RGB値から各成分を取り出す |
| 文字コード処理 | 範囲や上位ビットを見る |
| パフォーマンス実験 | 正規表現以外の判定を試す |
よくある誤解
| 誤解 | 実際 |
|---|---|
| ビット演算は必ず速い | JIT最適化や処理内容によります |
| ビット演算は可読性も高い | 初心者には読みにくいことが多いです |
| ` | と |
& と && は同じ | & はビットAND、&& は論理ANDです |
まとめ
ビット演算は、数値を0と1の並びとして扱う演算です。特定ビットの抽出や低レベル処理では便利ですが、JavaScriptでは32ビット整数変換や可読性に注意します。実務では、速さだけでなく読みやすさも含めて使うか判断します。