JavaScriptでわかるビット演算子の基本と使い方!初心者でも簡単に理解
生徒
「先生、ビット演算子って聞いたことがありますけど、難しそうです。何に使うんですか?」
先生
「ビット演算子は、コンピュータが内部で扱う0と1の情報を直接操作するための演算子です。例えば、複雑な計算やフラグ管理などに使えます。」
生徒
「0と1だけで計算するんですか?ちょっとイメージが湧きません。」
先生
「大丈夫です。0と1はスイッチのオンとオフのようなものだと考えるとわかりやすいですよ。それでは、基本から順番に見ていきましょう!」
1. ビット演算子とは?
ビット演算子は、数値を二進数に変換して0と1の単位で計算するための演算子です。JavaScriptには、AND(&)、OR(|)、XOR(^)、NOT(~)、左シフト(<<)、右シフト(>>)、ゼロ埋め右シフト(>>>)があります。これらを使うと、数値を効率的に操作できます。
2. AND演算子(&)の使い方
AND演算子は、両方のビットが1の場合にだけ1を返す演算です。例えば、8と5をビット演算してみましょう。
let a = 8; // 二進数で1000
let b = 5; // 二進数で0101
let result = a & b; // AND演算
console.log(result);
0
8は1000、5は0101なので、AND演算では共通の1がなく、結果は0になります。
3. OR演算子(|)とXOR演算子(^)
OR演算子は、どちらかのビットが1なら1を返します。XORは、どちらか片方だけが1の場合に1を返します。
let x = 8; // 1000
let y = 5; // 0101
console.log(x | y); // OR演算
console.log(x ^ y); // XOR演算
13
13
OR演算は1000 | 0101 = 1101(二進数で13)、XOR演算もこの場合同じ結果になります。XORはビットが異なる時に1になります。
4. NOT演算子(~)の使い方
NOT演算子はビットを反転させます。0は1に、1は0になります。
let num = 5; // 二進数で0101
console.log(~num);
-6
NOT演算は符号付き整数のルールで反転するため、結果は-6になります。これはJavaScriptの二進数の表現(補数表現)によるものです。
5. 左シフト(<<)と右シフト(>>)の基本
左シフトはビットを左に移動させ、右シフトは右に移動させます。左シフトは数値を2倍、右シフトは半分にするイメージです。
let value = 3; // 0011
console.log(value << 2); // 左に2ビットシフト
console.log(value >> 1); // 右に1ビットシフト
12
1
左シフトで0011が1100になり12、右シフトで0011が0001になり1となります。
6. ゼロ埋め右シフト(>>>)の使い方
ゼロ埋め右シフトは、右にシフトするときに符号に関係なく0で埋める操作です。負の数も正しく処理できます。
let neg = -8;
console.log(neg >>> 2); // ゼロ埋め右シフト
1073741822
負の数でもビットを正確に扱えるため、ビットフラグの操作などに便利です。
7. ビット演算子の活用例
ビット演算は、フラグ管理や効率的な数値操作に役立ちます。例えば、複数の設定を1つの整数で管理できます。
let flag = 0;
const READ = 1; // 0001
const WRITE = 2; // 0010
const EXECUTE = 4;// 0100
// WRITE権限を追加
flag |= WRITE;
console.log(flag); // 2
// READ権限も追加
flag |= READ;
console.log(flag); // 3
2
3
ビット演算を使うことで、複数の状態を効率的に管理でき、条件チェックも簡単になります。
8. まとめると
ビット演算子は最初は少し難しそうに見えますが、0と1をスイッチのオンオフとして考えると理解しやすくなります。AND(&)、OR(|)、XOR(^)、NOT(~)、シフト(<<, >>, >>>)を覚えておくと、数値操作やフラグ管理など幅広く使えます。小さな例から試して、少しずつ慣れていきましょう。
まとめ
今回学んだJavaScriptのビット演算子は、AND(&)、OR(|)、XOR(^)、NOT(~)、左シフト(<<)、右シフト(>>)、ゼロ埋め右シフト(>>>)の基本操作と、それぞれの使い方を理解することができました。ビット演算は一見難しそうに見えますが、数値を二進数に変換して0と1のスイッチとして考えると直感的に理解できます。例えば、AND演算は両方のビットが1のときだけ1を返すので、条件が重なる場面で使えます。OR演算はどちらかが1なら1になるため、複数条件のいずれかを判定したいときに便利です。XOR演算はビットが異なる場合に1を返すため、フラグの切り替えや排他的条件に役立ちます。
NOT演算はビットの反転を行うため、状態の反転や符号付き数値の計算に利用できます。左シフト(<<)はビットを左に移動させて数値を2倍、右シフト(>>)はビットを右に移動させて半分にするイメージで、数値操作を効率化できます。ゼロ埋め右シフト(>>>)は負の数でも符号に関係なく右にシフトできるため、フラグ管理やビット列の操作に最適です。さらに、複数の権限や状態を一つの整数で管理するビットフラグの活用法も紹介しました。
実際にJavaScriptのコードを書いて試すことで、AND、OR、XOR、NOT、シフト演算の結果を確認し、どのように数値が変化するかを体感できました。小さな例から段階的に理解を深めることで、ビット演算を効率よく使いこなせるようになります。フラグ管理や数値操作だけでなく、条件判定やデータ圧縮、暗号処理などさまざまな場面で役立つ技術ですので、ぜひ繰り返し練習して身につけてください。
サンプルプログラム
// フラグ管理の例 let permission = 0; const READ = 1; // 0001 const WRITE = 2; // 0010 const EXECUTE = 4; // 0100
// WRITE権限を追加
permission |= WRITE;
console.log(permission); // 2
// READ権限も追加
permission |= READ;
console.log(permission); // 3
// XORでEXECUTE権限を切り替え
permission ^= EXECUTE;
console.log(permission); // 7
// ANDでREAD権限を確認
console.log((permission & READ) !== 0); // true
2
3
7
true
生徒
「先生、今日のビット演算は最初難しいと思っていたんですけど、実際にコードを書いてみると少し理解できてきました。」
先生
「そうですね。ビット演算は最初は抽象的に感じますが、0と1をスイッチとして考えると理解しやすくなります。ANDやOR、XOR、NOTの意味もだんだんイメージできてきましたね。」
生徒
「フラグ管理の例もわかりやすかったです。複数の権限を一つの整数で管理できるんですね。」
先生
「そうです。ビット演算を使うとメモリを効率的に使えるだけでなく、条件判定も簡単に行えます。練習を重ねることで、ゲームやアプリの開発でも活用できるスキルになります。」
生徒
「左シフトや右シフト、ゼロ埋め右シフトも、計算結果を見てやっとイメージがつかめました。2倍や半分になるイメージで考えると覚えやすいですね。」
先生
「その通りです。小さな数値から試して、ANDやOR、XOR、NOT、シフトの結果を確認することで、ビット演算の感覚が自然に身につきます。ぜひ今日学んだことを繰り返し練習して、自分のものにしてください。」