ビット処理ノウハウ

何年やっても次々と新しい発見があるという
Rubyですが、ほんとにいろいろ発見があります。
最近は組み込み系のマシンにRubyのプログラムを
のっける関係でビット処理をしていたのですが、
いろいろ発見がありましたね。

特定のビットが立っているかを調べる

最初、こんなコードを書いていました。

def flag_b
  (@flag & 0b0010) == 0b0010 ? true : false
end

なんとかならんのか?と思っていたら、

def flag_b
  @flag[1] == 1 ? true : false
end

これでよかった。
trueとかfalseでなくて、1か0を返すなら、

def flag_b
  @flag[1]
end

でOKです。

特定のビットに値を代入するには

def flag_b=(opt)
  opt ? @flag=@flag | 0b0010 : @flag=@flag^0b0010
end

とやってみて、なんとかならんのかと思ったら、

def flag_b=(opt)
  opt ? @flag|=0b0010 : @flag^=0b0010
end

自己代入でビット処理ができました。
ビットの演算も自己代入演算出来て、便利です。
 
optの中身が真だったらビットを立てる。
optの中身が偽だったらビットを下ろす仕様です。