Rubyのビット演算子、論理演算子について
論理演算子
一番よく使うやつ。
Ruby の論理積、論理和ってtrue
、false
じゃなくてオペランドのどちらかを返す。短絡評価。(片方を評価して結果がわかったら、もう片方を評価せずに結果を返す)
論理積はどちらも真であることを期待するけど、例えば以下のような感じ。
nil && 1 #=> nil
nil
を評価した時点でどちらも真である希望はなくなるので、この時点で心折れてnil
を返す。
1 && nil #=> nil
とかであれば1
を評価して真なので期待に胸をふくらませて次へ。
でもnil
なので絶望にひたりながらnil
を返す。
論理和の場合はどちらかが真であればいいので
nil || 1 #=> 1
1 || nil #=> 1
となる。
ビット演算子
個人的には普段、あまり使わないかも。
整数の2進表現をビットの列として演算を行う。
ビット積はどちらも 1 の場合のみ 1、それ以外は 0 になるので
1 & 2 #=> 0
となる。(1 は 2 進数で 01、2 は 2 進数で 10)
ビット和はどちらかが 1 なら 1 になるので
1 | 2 #=> 3
Array でビット演算子を使う場合
これ、最近まで知らなかったやつ。地味に使えそう。
Array
には &
、|
っていうメソッドが定義されてるぽい。Array.instance_methods
やったらちゃんとこいつら出てくる。
&
は 2 つの配列を評価して重複する要素を新しい配列に入れて返す。イメージ通り。
[1, 2, 3] & [2, 4, 6] #=> [2]
|
は 2 つの配列を合わせて、重複を取り除いてから返す。
[1, 2, 3] | [2, 4, 6] #=> [1, 2, 3, 4, 6]
まとめ
Array
のビット演算子、積極的に使っていきたい。