逆引きビット演算リファレンス
常識レベルのネタですが、たまに使うと忘れてたりするので。よく使う?ビット演算を、次に示すファイルの操作権限設定を例としてまとめてみます。
- ファイルに対する操作権限を3ビットの数値で記録する。
- 読み込み権.. 1ビット目, 書き込み権..2ビット目 とする。
各権限を示す定数は次の通り。
# 読み込み権 READ = 1 << 0 # 001 # 書き込み権 WRITE = 1 << 1 # 010 # すべての権限 ALL = READ | WRITE # 011 # 権限なし NONE = 0 # 000
特定のビットをonにしたい
「or」を使う。以下は書き込み権を付与する例。
# 書き込み権を付与 puts NONE | WRITE # 010
特定のビットをoffにしたい
「反転してand」する。読み込み権を剥奪。
# 読み込み権を剥奪 puts ALL & ~READ # 010
「3ビット目は、ユーザーに見せない隠しパラメータなので必ずoffにした状態で記録。参照時もoffにして返す」時とかにも使う。
特定のビットのon/offを判定したい。
「and」を使う。読み込み権があるかどうかをチェックする。
# 読み込み権があるか評価 puts ALL & READ != 0 # true puts NONE & READ != 0 # false
おまけ:今日の文系プログラマ
昔(遙か昔だからね!)「|」とか「&」を使うの知らなくて、「+,-」でやってたなー(遠い目)
# 権限 privilege = 0 privilege += READ # 読み込み権を付与 privilege -= READ # 読み込み権を剥奪
一応動くんだけどね・・・。これon/off判定はどうやってたんだろ、思い出せん。