はじめに
ビット演算は学生時代に勉強したものの、現場で使う機会がほとんどなく、活用法についてイマイチ分からなかった過去があります。
僕と同じように活用法について悩んでいる方の一助になればと思い、実際の活用法についてまとめました。
※社内勉強会で作成したスライドをほぼんど流用していますので、簡易的なものになっていますがご了承ください。
ビット演算とは?
こんな感じのやつで、ITパスポートや学生の時とかに習うやつ。
引用元:https://ameblo.jp/karin-koron-kichi/entry-12633595228.html
実際のビット演算
2進数に変換すると分かりやすい。
13は1101 3は0011
- AND演算は両方1なら1になるので、1101 AND 0011 == 0001
- OR演算はいずれかが1なら1になるので、1101 OR 0011 == 1111
- XOR演算は両方1なら0になるので、1101 XOR 0011 == 1110
どういう時に使えば良いか分からない
実際に勉強したは良いものの、イマイチどこで使えば良いか分からない…。
役に立った使い方
- 祝日含めた曜日フラグ
- 1バイトでフラグを管
- 権限(認可)管理フラグ
※いずれもフラグ管理で力を発揮した。
祝日含めた曜日管理(bit演算無しVer)
要件
- 曜日、祝日によって表示内容が切り替わるシステム
- 管理者は日、月、火、水、木、金、土、祝のチェックボックスで設定可能
DBに曜日、祝日フラグカラムを用意。
sun、mon、tue、wed、thu、fri、sat、holiday
チェックボックス表示の処理時
SELECT文で各カラムを取得し、配列に入れて、表示。
カラムが多くなってしまい配列に入れてあげたりして処理も面倒。
祝日含めた曜日管理(bit演算有りVer)
DBにweekというカラムにbit型でフラグを格納。
日月火水木金土祝 = 00000000
レイアウトAは月曜〜金曜:01111100
レイアウトBは土日祝日:10000011
チェックボックス表示の処理時
SELECT文でweekカラムを取得し、forループ内でシフト演算(1を起点に左シフト)を活用して表示。
1個のカラムで制御できて配列に入れずとも処理ができる!
1バイトでフラグを管理(bit演算無しVer)
要件
- ゲームのマッチングサーバ側の処理でデータ通信を極力抑えないとNG
- 新たにパラメータを追加するとクライアント側も修正が増えるので出来れば既存パラメータ内で
既存パラメータ(例)
user_name, user_level, flg, matching_state_date_time, etc…
バッファも無く新たにパラメータを追加しては駄目って無理じゃね?
どうすれば…。
1バイトでフラグを管理(bit演算有りVer)
既存パラメータ(例)
user_name, user_level, flg, matching_state_date_time, etc…
flgの未使用bitを活用。
00[1]11111
パラメータを追加せず、データ転送量も同量で済んだ!
権限(認可)管理フラグ(bit演算無しVer)
要件
- 管理ツールでアカウント毎に権限を持たせたい
DBにinteger型のauthorityカラムを用意
(例)
1:閲覧、10:編集、100:設定変更、1000:管理者
編集権限があるか判定したい場合
該当の桁数の数字を抽出したりするような処理になりそう。
判定処理に手間が掛かる。
権限(認可)管理フラグ(bit演算有りVer)
DBにbit型のauthorityカラムを用意
(例)
0001:閲覧、0010:編集、0100:設定変更、1000:管理者
編集権限があるか判定したい場合
return user.authority & AUTHORITY_EDIT
bit演算ANDを活用すれば処理もスッキリ!
まとめ
- 複数フラグを管理するのに絶大な効果を発揮する
- 1バイトで管理出来るので容量もコンパクト
- 判定処理も配列使わずともそのまま処理できるので便利
最後まで読んで頂きありがとうございましたm(_ _)m
※bit演算無しVerは有りVerを引き立たせるために極端な例にしています。