重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

こんばんは。
よくわからないので教えてください。

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」は「排他的理論和」だそうです。
よろしくお願いします。

A 回答 (7件)

or は論理和ですね。


A or B といった場合に、A と B のどちらかが真なら A or B も真となる。

一方排他的論理和の場合は
A Xor B といった場合に、A と B の真偽が違えば A Xor B が真となります。
例えば A が 真で B が 偽の場合とその逆ですね。
    • good
    • 1
この回答へのお礼

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

ご回答いただいたのにすいません、、、

お礼日時:2009/07/12 01:31

昔々に、機械語やアセンブラでビット演算で重宝したものだが、文字列を扱う、質問のような例で、XORを考える機会は無いと思う。


もっとほかのことで、VBAで勉強した方が良いことが沢山有る。
そんなこと全て終わった、VBAの熟達者やビット演算に関係有る業界でなければ、XORのことは忘れて良いと思う。
GoogleででもXORやORの解説記事をよみ、どんな場合に良く使いかも含めて勉強のこと。
数学・論理を基礎に置くものなので、意味は明確であいまいなところはない。
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2009/07/18 01:23

No2です。


> こういうことですよね?
> 「Xorのtest」のほうはどちらも該当するからダメと言うことですよね?
まぁ、考え方としてはそういうことになるのですが、厳密に言うと比較対象範囲のビットごとの比較ということになってきますので、文字列の場合は期待するものと結果が異なる場合があるかもしれません。
どのような時に違うかは確認していませんが、文字コードのビットパターンで比較すれば良いだけですが、同じ文字列なら同じビットパターンとなるので、Xorの結果は偽(0)であることは明白であることです。

ただ、文字列比較の場合は、比較演算子とAnd、Orの組み合わせで殆ど対応でき、他人が見ても理解もし易いので、私はXorを文字列比較に使ったことはありません。
昔は諸々の制約などから、シフトや論理演算、その他の組み合わせなどで、プログラムをシンプルにしたり、高速化したりのテクニックを使うこともあったのですが、今はそういうことよりも、如何に分かり易いプログラムにするかのほうが重要と思います。
 
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/07/18 01:20

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
などとわかりやすい名称を割り当てて使うのが一般的です。

ですから、質問の例題はプログラミングの難しさを説明するには最適でしょうが、絶対にこんな使い方はしません。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/07/18 01:19

補足的な説明をさせて頂きます。


昔は、メモリ容量(&ディスク容量)がさほどなかったため、それを節約するためなどにビットでの情報保持が用いられていました。
つまり、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などのビット操作を使わないことがよりわかりやすいプログラムと言えるでしょう。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/07/18 01:18

こんばんは。



サンプルのコードはあまりよくありませんね。
>「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
'-------------------------------------------
実際にコードで書くと、間違えそうな気がしますので、なかなか書きません。論理演算という方法は、数学的な足し算で、 確かに、判定が、逆転するので、分かりやすいのですが、実際にコードを書くときは、混乱します。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/07/18 01:18

下記の論理演算の意味が理解できればすぐ分かると思います。


真理値表の1と0は、比較結果が真(比較結果が等しい)と偽(比較結果が異なる)と解釈してもらえば分かり易いと思います。

論理演算
http://www.asahi-net.or.jp/~AX2S-KMTN/ref/logico …

例えば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)となり、同じく「りんご」が表示されるということです。
 
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。少しわかってきました。

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」のほうはどちらも該当するからダメと言うことですよね?

お礼日時:2009/07/12 02:18

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!