論理演算をrubyで表現するとこうなった

# コード
```ruby:test.rb
require 'pp'
require 'optparse'

class Test

  def and(*args)
    args.all?{|arg| arg == 1} ? 1 : 0
  end

  def or(*args)
    args.any?{|arg| arg == 1} ? 1 : 0
  end

  def xor(*args)
    args.inject(:+) % 2 == 1 ? 1 : 0
  end

  def nand(*args)
    args.all?{|arg| arg == 1} ? 0 : 1
  end

  def nor(*args)
    args.any?{|arg| arg == 1} ? 0 : 1
  end

  def not(*args)
    args.map{|arg| if arg == 0; 1 elsif arg == 1; 0 end }
  end

end

@test = Test.new
argv_options = ARGV.getopts('l:', 'logic:')
argv_args = ARGV.map{|i| i.to_i}
logic = argv_options['l'] || argv_options['logic']

pp @test.send(logic, *argv_args)
```


# 論理積（AND）
`全て`が1であれば1を返す

|x|y|z|コマンド|出力|
|----|---|---|---|---|
|0|0|0|$ ruby test.rb -l and 0 0 0|0|
|0|0|1|$ ruby test.rb -l and 0 1 1|0|
|0|1|0|$ ruby test.rb -l and 0 1 0|0|
|0|1|1|$ ruby test.rb -l and 0 1 1|0|
|1|0|0|$ ruby test.rb -l and 1 0 0|0|
|1|0|1|$ ruby test.rb -l and 1 0 1|0|
|1|1|0|$ ruby test.rb -l and 1 1 0|0|
|1|1|1|$ ruby test.rb -l and 1 1 1|1|





# 論理和（OR）
`どれか一つでも`1であれば1を返す

|x|y|z|コマンド|出力|
|----|---|---|---|---|
|0|0|0|$ ruby test.rb -l or 0 0 0|0|
|0|0|1|$ ruby test.rb -l or 0 1 1|1|
|0|1|0|$ ruby test.rb -l or 0 1 0|1|
|0|1|1|$ ruby test.rb -l or 0 1 1|1|
|1|0|0|$ ruby test.rb -l or 1 0 0|1|
|1|0|1|$ ruby test.rb -l or 1 0 1|1|
|1|1|0|$ ruby test.rb -l or 1 1 0|1|
|1|1|1|$ ruby test.rb -l or 1 1 1|1|





# 排他的論理和（XOR）
`1が偶数個の場合は0を返し、奇数個の場合は1を返す`（自信ない。。）

|x|y|z|コマンド|出力|
|----|---|---|---|---|
|0|0|0|$ ruby test.rb -l xor 0 0 0|0|
|0|0|1|$ ruby test.rb -l xor 0 1 1|1|
|0|1|0|$ ruby test.rb -l xor 0 1 0|1|
|0|1|1|$ ruby test.rb -l xor 0 1 1|0|
|1|0|0|$ ruby test.rb -l xor 1 0 0|1|
|1|0|1|$ ruby test.rb -l xor 1 0 1|0|
|1|1|0|$ ruby test.rb -l xor 1 1 0|0|
|1|1|1|$ ruby test.rb -l xor 1 1 1|1|









# 否定論理積（NAND）
`ANDの逆`

|x|y|z|コマンド|出力|
|----|---|---|---|---|
|0|0|0|$ ruby test.rb -l nand 0 0 0|1|
|0|0|1|$ ruby test.rb -l nand 0 1 1|1|
|0|1|0|$ ruby test.rb -l nand 0 1 0|1|
|0|1|1|$ ruby test.rb -l nand 0 1 1|1|
|1|0|0|$ ruby test.rb -l nand 1 0 0|1|
|1|0|1|$ ruby test.rb -l nand 1 0 1|1|
|1|1|0|$ ruby test.rb -l nand 1 1 0|1|
|1|1|1|$ ruby test.rb -l nand 1 1 1|0|





# 否定論理和（NOR）
`ORの逆`

|x|y|z|コマンド|出力|
|----|---|---|---|---|
|0|0|0|$ ruby test.rb -l nor 0 0 0|1|
|0|0|1|$ ruby test.rb -l nor 0 1 1|0|
|0|1|0|$ ruby test.rb -l nor 0 1 0|0|
|0|1|1|$ ruby test.rb -l nor 0 1 1|0|
|1|0|0|$ ruby test.rb -l nor 1 0 0|0|
|1|0|1|$ ruby test.rb -l nor 1 0 1|0|
|1|1|0|$ ruby test.rb -l nor 1 1 0|0|
|1|1|1|$ ruby test.rb -l nor 1 1 1|0|



# 否定（NOT）

前述の演算たちとは違い、ビット毎に適用される規則らしい（よくわかっていない）

|x|y|z|コマンド|出力|
|----|---|---|---|---|
|0|0|0|$ ruby test.rb -l not 0 0 0|[1, 1, 1]|
|0|0|1|$ ruby test.rb -l not 0 1 1|[1, 1, 0]|
|0|1|0|$ ruby test.rb -l not 0 1 0|[1, 0, 1]|
|0|1|1|$ ruby test.rb -l not 0 1 1|[1, 0, 0]|
|1|0|0|$ ruby test.rb -l not 1 0 0|[0, 1, 1]|
|1|0|1|$ ruby test.rb -l not 1 0 1|[0, 1, 0]|
|1|1|0|$ ruby test.rb -l not 1 1 0|[0, 0, 1]|
|1|1|1|$ ruby test.rb -l not 1 1 1|[0, 0, 0]|



# 終わりに
参考にさせていただいたサイト：[2進数と遊ぶ - 論理演算（ビット演算）](http://www.geocities.jp/zaqzaqpa/2sinsuu9.htm)

作るのに結構時間掛かった。。

間違っている箇所やもっと綺麗な書き方、コードが冗長になったとしてもより適切な論理演算の表現がありましたらコメント貰えるとうれしいです！