24
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Ruby に xor は無かった

Last updated at Posted at 2019-08-02

Ruby で条件式として XOR(eXclusive OR;排他的論理和)演算を書く必要ができた。

えっと,xor なんて演算子あったっけ?と思ったら無かった。
そうか,じゃあ &&, || があるんだから ^^ かな? 見たことないけど。と思ったらこれも無かった。

ええーっ!! 無いんかい。
め,めどい。

えっと,eq1, eq2 を何らかの式とする。評価値を論理値として使い,

eq1 xor eq2

と書きたかった。
えーとまさか

(eq1 || eq2) && !(eq1 && eq2)

とか。誰が書くかい!

え? なに? ^ を使えだって?
そりゃまあ

true ^ true # => false
true ^ false # => true
false ^ true # => true
false ^ false # => false

だから,こいつが XOR 演算子として働くことは分かってますがな。

問題は,eq1eq2 の評価値が true, false とは限らんちゅうことなんですわ。
整数だったらビット列演算の XOR になるやん?

はー,仕方がないのぅ。論理値を true, false に変換するあれを使うか。

!!eq1 ^ !!eq2

これでいいわけだが,なんか見た目がどうもな。

ちなみに XOR でド・モルガン律みたいのはあるのかな? 無いのか。でも代わりに

P \veebar Q  = \overline P \veebar \overline Q

が成り立つのか(数学で XOR を $\veebar$ って書くの初めて知った)。そりゃそうでしょ,XOR は「真偽の不一致」を表してるんだから。

そうすると,

!eq1 ^ !eq2

でいいわけだ。論理的には。
でもさ,これ 5 年後の自分が見たら「ん? 何やってんの?」って疑問に思うかもしれないな。

しかし,十何年も Ruby を書いてて,今日初めて XOR 演算を書いたよ。

24
11
9

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?