• ベストアンサー

「Xor」と「Or」の違い(vba)

こんばんは。 よくわからないので教えてください。 Option Explicit Sub Xorのtest() Dim フルーツ As String フルーツ = "りんご" If フルーツ = "りんご" Xor フルーツ = "イチゴ" Then MsgBox フルーツ End If End Sub '**************************************** Sub Orのtest() Dim フルーツ As String フルーツ = "りんご" If フルーツ = "りんご" Or フルーツ = "イチゴ" Then MsgBox フルーツ End If End Sub 上記のコードなのですが どちらも結果は同じです。 「Xor」と「Or」の違いがよくわからないのですが 何が違うのでしょうか? 調べてみると「Xor」は「排他的理論和」だそうです。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • aigaion
  • ベストアンサー率47% (287/608)
回答No.1

or は論理和ですね。 A or B といった場合に、A と B のどちらかが真なら A or B も真となる。 一方排他的論理和の場合は A Xor B といった場合に、A と B の真偽が違えば A Xor B が真となります。 例えば A が 真で B が 偽の場合とその逆ですね。

noname#150256
質問者

お礼

うーん、、、 難しいですね、、、 私の示したコードで表すならどういう風にすればいいでしょうか? ご回答いただいたのにすいません、、、

すると、全ての回答が全文表示されます。

その他の回答 (6)

  • imogasi
  • ベストアンサー率27% (4737/17070)
回答No.7

昔々に、機械語やアセンブラでビット演算で重宝したものだが、文字列を扱う、質問のような例で、XORを考える機会は無いと思う。 もっとほかのことで、VBAで勉強した方が良いことが沢山有る。 そんなこと全て終わった、VBAの熟達者やビット演算に関係有る業界でなければ、XORのことは忘れて良いと思う。 GoogleででもXORやORの解説記事をよみ、どんな場合に良く使いかも含めて勉強のこと。 数学・論理を基礎に置くものなので、意味は明確であいまいなところはない。

noname#150256
質問者

お礼

ありがとうございます。

すると、全ての回答が全文表示されます。
  • s-uzen
  • ベストアンサー率65% (2051/3119)
回答No.6

No2です。 > こういうことですよね? > 「Xorのtest」のほうはどちらも該当するからダメと言うことですよね? まぁ、考え方としてはそういうことになるのですが、厳密に言うと比較対象範囲のビットごとの比較ということになってきますので、文字列の場合は期待するものと結果が異なる場合があるかもしれません。 どのような時に違うかは確認していませんが、文字コードのビットパターンで比較すれば良いだけですが、同じ文字列なら同じビットパターンとなるので、Xorの結果は偽(0)であることは明白であることです。 ただ、文字列比較の場合は、比較演算子とAnd、Orの組み合わせで殆ど対応でき、他人が見ても理解もし易いので、私はXorを文字列比較に使ったことはありません。 昔は諸々の制約などから、シフトや論理演算、その他の組み合わせなどで、プログラムをシンプルにしたり、高速化したりのテクニックを使うこともあったのですが、今はそういうことよりも、如何に分かり易いプログラムにするかのほうが重要と思います。  

noname#150256
質問者

お礼

再度ありがとうございます。 わかり易いものを心がけます。

すると、全ての回答が全文表示されます。
noname#168404
noname#168404
回答No.5

No.4です。 trueとfalseの厳密な定義は、 false=0 true=0以外 です。(true=1と思いがちですが) また、XOR(排他的論理和)は論理演算(ビット演算)ですが、AND(論理積),OR(論理和)は、AND(かつ),OR(あるいは)と結果的に同じ答えになるため混同して使われることが多いようです。 つまり、質問の例題(?)はXORを理解する上で適切なものと言えません。 XORを実際に使用する時には、ビット演算なので必ずビットに対して意味がなければ、わかりにくくなるだけで使う意味がありません。 そのため、No.4の例でも 「冷蔵庫が欠品」KPN_REIZOUKO=0001 「炊飯器が欠品」KPN_SUIHANKI=0010 「冷蔵庫が発注済み」HCU_REIZOUKO=0001 「炊飯器が発注済み」HCU_SUIHANKI=0010 などとわかりやすい名称を割り当てて使うのが一般的です。 ですから、質問の例題はプログラミングの難しさを説明するには最適でしょうが、絶対にこんな使い方はしません。

noname#150256
質問者

お礼

あまり使わないのですね。ありがとうございます。

すると、全ての回答が全文表示されます。
noname#168404
noname#168404
回答No.4

補足的な説明をさせて頂きます。 昔は、メモリ容量(&ディスク容量)がさほどなかったため、それを節約するためなどにビットでの情報保持が用いられていました。 つまり、0,1(false/true)の1ビットに有/無などの意味を持たせて使っていました。 最近ではメモリ容量も大きくなり、それに伴いビット操作はあまり使われなくなってきました。 たとえば、欠品した時に(1,true)として 1(0001).冷蔵庫が欠品で1 2(0010).炊飯器が欠品で1 4(0100).電子レンジが欠品で1 8(1000).掃除機が欠品で1 (左の数字は「10進数(2進数)」です) また、上記とは別に発注した時に(1,true)として 1(0001).冷蔵庫が発注済みで1 2(0010).炊飯器が発注済みで1 4(0100).電子レンジが発注済みで1 8(1000).掃除機が発注済みで1 (左の数字は「10進数(2進数)」です) この時に、欠品で未発注の商品を調べるとします。 例: 冷蔵庫と炊飯器と電子レンジが欠品の場合 (0111) となります。 炊飯器が発注済みの場合 (0010) となります。 欠品で未発注の商品を調べたい時にXORを使用します。 (0111)xor(0010)=(0101) この結果から、冷蔵庫と電子レンジを発注しなければいけないことがわかります。(掃除機は在庫あり、炊飯器は発注済み) これに「仕入れ停止」などを付けて、さらに条件を絞り込んだりもします。 もっと単純に、発注したら欠品を0にすればいいと思うでしょうが、欠品の有無を他の処理でも認識する必要がある場合には、そう簡単にはできません。(欠品の状態(期間)を明確に定義する必要がありますが) しかし、すでに昔の技術(?)であるため、今ではXORなどのビット操作を使わないことがよりわかりやすいプログラムと言えるでしょう。

noname#150256
質問者

お礼

ビットと絡んでるんですね。 ありがとうございます。

すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんばんは。 サンプルのコードはあまりよくありませんね。 >「Xor」は「排他的理論和」だそうです。 これって、英語にはこれに似たような表現があるようですが、日本語には、このような表現がありませんから、これを知らないと翻訳などさせると、必ず間違いが出ます。 例えば、 Non fruit is not both of an apple or a strawberry on a plate. (and ではない) × お皿の上に(あるものは)、両方のりんごかイチゴでないものは、フルーツではない。   ↓ ○ お皿の上に(あるものは)、両方のりんごとイチゴでないものは、フルーツではない。 日本語と英語では、and と or が逆転してしまいます。 XOR 排他的論理和を図式化すると、 ------------------    A    B  判定    ------------------   True True  False  True False True  False True  True  False False False それをコードにすると、  '------------------------------------------- Sub Test1_XOR()   Dim a As String, b As String   a = "りんご"   b = "イチゴ"   If a = "りんご" Xor b = "イチゴ" Then     MsgBox "それらは、いずれかがフルーツである。", vbInformation   Else     MsgBox "それらは、どちらもフルーツではない。", vbExclamation   End If End Sub Sub Test2_XOR()   Dim a As String, b As String   a = "りんご"   b = "イチゴ"   If a <> "りんご" Xor b = "イチゴ" Then     MsgBox "それらは、いずれかがフルーツである。", vbInformation   Else     MsgBox "それらは、どちらもフルーツではない。", vbExclamation   End If End Sub Sub Test3_XOR()   Dim a As String, b As String   a = "りんご"   b = "イチゴ"   If a = "りんご" Xor b <> "イチゴ" Then     MsgBox "それらは、いずれかがフルーツである。", vbInformation   Else     MsgBox "それらは、どちらもフルーツではない。", vbExclamation   End If End Sub Sub Test4_XOR()   Dim a As String, b As String   a = "りんご"   b = "イチゴ"   If a <> "りんご" Xor b <> "イチゴ" Then     MsgBox "それらは、いずれかがフルーツである。", vbInformation   Else     MsgBox "それらは、どちらもフルーツではない。", vbExclamation   End If End Sub '------------------------------------------- Sub Test1_OR()   '比較   Dim a As String, b As String   a = "りんご"   b = "イチゴ"   If a = "りんご" Or b = "イチゴ" Then     MsgBox "それらは、いずれかがフルーツである。", vbInformation   Else     MsgBox "それらは、どちらもフルーツではない。", vbExclamation   End If End Sub '------------------------------------------- 実際にコードで書くと、間違えそうな気がしますので、なかなか書きません。論理演算という方法は、数学的な足し算で、 確かに、判定が、逆転するので、分かりやすいのですが、実際にコードを書くときは、混乱します。

noname#150256
質問者

お礼

難しいですね、、、 ありがとうございます。

すると、全ての回答が全文表示されます。
  • s-uzen
  • ベストアンサー率65% (2051/3119)
回答No.2

下記の論理演算の意味が理解できればすぐ分かると思います。 真理値表の1と0は、比較結果が真(比較結果が等しい)と偽(比較結果が異なる)と解釈してもらえば分かり易いと思います。 論理演算 http://www.asahi-net.or.jp/~AX2S-KMTN/ref/logicope.html 例えばAとBを比較式とした時に、A Or B と A Xor B の場合 論理和(Or)は、比較結果のAまたはBのいずれかが真ならTrue条件に一致なのに対して、 排他的論理和(Xor)は、比較結果の一方だけが真の場合にTrue条件に一致となります。 AとBが真(同じ)であったり、AもBも偽(異なる)場合は偽となり、True条件にならないということです。 質問の例の場合のそれぞれの比較式の結果から、 Xorの場合は、1 Xor 0 と異なるので、結果は真(1)となり「りんご」と表示、 Orの場合は、1 Or 0 と一方が真(1)なので、結果は真(1)となり、同じく「りんご」が表示されるということです。  

noname#150256
質問者

お礼

ご回答ありがとうございます。少しわかってきました。 Sub Xorのtest() Dim フルーツ1 As String Dim フルーツ2 As String フルーツ1 = "りんご" フルーツ2 = "イチゴ" If フルーツ1 = "りんご" Xor フルーツ2 = "イチゴ" Then MsgBox フルーツ1 End If End Sub Sub Orのtest() Dim フルーツ1 As String Dim フルーツ2 As String フルーツ1 = "りんご" フルーツ2 = "イチゴ" If フルーツ1 = "りんご" Or フルーツ2 = "イチゴ" Then MsgBox フルーツ1 End If End Sub こういうことですよね? 「Xorのtest」のほうはどちらも該当するからダメと言うことですよね?

すると、全ての回答が全文表示されます。

関連するQ&A