この記事は株式会社シンプルウェイ Advent Calendar 2025の4日目の記事です。
前々回、前回に続き、普段のプログラミングで意識しておきたいパフォーマンスを考慮したコーディングを紹介したいと思います。
今回はビット演算です。
まずビットとはなにか。コンピュータの中ではデータはすべて0と1で表されています。
例えば、10進数の 127 は 0111 1111 、ASCII文字の a は 0110 0001 です。この0と1がビットです。
このビットを直接操作できれば、処理が速そうなのは容易に想像できそうです。
ビットの操作としては下記の演算がどのプログラミング言語にも用意されているでしょう。
- 論理和 (OR)
- 論理積 (AND)
- 排他的論理和 (XOR)
- 否定 (NOT)
- シフト ( SHL , SHR )
さて、これらのビット演算でどのような処理ができるでしょう。
一番簡単で効果がありそうなのは2で割るでしょうか。
var a = 2;
var b = a >> 1;
は
var a = 2;
var b = a / 2;
と同じです。(さすがにこのコードだとコンパイル時に最適化されそうですが)
割り算はCPUにとっては重い処理の部類に入るので、できるだけ割らないコードにすることが重要です。
余りの値を求めるときにも使えます。
var a = 10;
var b = a && 0b11;
は
var a = 10;
var b = a % 4;
これは具体的な使用例としては、ユーザーのアバター画像が登録できる機能があるとして、アバター画像が登録されていないときには、ユーザーIDの下2ビットを使って、4種類のデフォルト画像の中から一つを代替画像として表示する、なんて機能を実装するときに使えそうです。
複数選択の値を一つの変数に格納するとかでも使えます。
画面上で「利用可能な通勤手段を選択してください」というような質問があったとき
- 徒歩
- 電車
- 自転車
- 電動キックボード
- 原付・自動二輪車
- 自動車
- 新幹線
- 飛行機
項目の選択有無を順番にビットに割り当てていけば、1バイトで8項目の値を保持できます。
| 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 |
|---|---|---|---|---|---|---|---|
| 飛 行 機 |
新 幹 線 |
自 動 車 |
原 付 ・ 自 動 二 輪 車 |
電 動 キ ッ ク ボ ー ド |
自 転 車 |
電 車 |
徒 歩 |
この場合は 13 という数字で表せます。
データベースを使うときでも、複数選択の値が1カラムに入っているとテーブル結合せずにビット演算でフィルタできるので、検索の高速化にも貢献できそうです。
ただし、選択肢が増減してしまうような項目には使いづらいことと、ぱっと値を見てどれが選択状態か分かりづらいので、使い所は慎重に考えたほうがいいでしょう。