ビット演算でフラグを管理する

複数のフラグを管理したい場合、いちいちDBに専用のカラムを追加していくのはめんどくさいです。(もちろんそのフラグで絞り込みたい場合は別ですが。)

ビット演算でフラグを判定する

ビット演算でフラグを判定すれば、フラグの管理がスリムになります。

FLAG_1 = 0b0001
FLAG_2 = 0b0010
FLAG_3 = 0b0100
FLAG_4 = 0b1000

status = 0b1010

if ((FLAG_1 & status) > 0) 
  puts 'フラグ1はtrueです'
else
  puts 'フラグ1はfalseです'
end

if ((FLAG_2 & status) > 0) 
  puts 'フラグ2はtrueです'
else
  puts 'フラグ2はfalseです'
end

if ((FLAG_3 & status) > 0) 
  puts 'フラグ3はtrueです'
else
  puts 'フラグ3はfalseです'
end

if ((FLAG_4 & status) > 0) 
  puts 'フラグ4はtrueです'
else
  puts 'フラグ4はfalseです'
end

出力結果

フラグ1はfalseです
フラグ2はtrueです
フラグ3はfalseです
フラグ4はtrueです

仕組み

2進数のどの桁が1になっているかを見て、flagがtrueかfalseかを判定します。
元となるフラグの2進数と、現在のステータスの2進数を「&」演算子でビット演算を行うことで、両方が1の時だけtrueになります。

まとめ

フラグを増やしたい時は、定数を増やすだけで判定できるので、管理が簡単になります。