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

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
などとわかりやすい名称を割り当てて使うのが一般的です。
ですから、質問の例題はプログラミングの難しさを説明するには最適でしょうが、絶対にこんな使い方はしません。

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などのビット操作を使わないことがよりわかりやすいプログラムと言えるでしょう。
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
'-------------------------------------------
実際にコードで書くと、間違えそうな気がしますので、なかなか書きません。論理演算という方法は、数学的な足し算で、 確かに、判定が、逆転するので、分かりやすいのですが、実際にコードを書くときは、混乱します。
No.2
- 回答日時:
下記の論理演算の意味が理解できればすぐ分かると思います。
真理値表の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)となり、同じく「りんご」が表示されるということです。
ご回答ありがとうございます。少しわかってきました。
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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- C言語・C++・C# C言語初心者です、、、お助けください 2 2023/03/14 20:08
- Visual Basic(VBA) エクセルのマクロについて教えてください。 7 2023/07/04 09:18
- Visual Basic(VBA) VBAの繰り返し処理表記と複数の処置条件について 1 2023/01/23 20:08
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/08/09 10:33
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Excel(エクセル) マクロのコードを、少しでも削って短くしたい 3 2022/08/30 07:46
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
煮物こんにゃくの冷凍保存について
-
スポンジケーキってどのくらい...
-
7文字以上のフルーツをできるだ...
-
中黒「・」か読点「、」か?
-
Excel MATCH関数で検索範囲内...
-
「であり」と「であって」の使...
-
ラズベリーの種の抜き方を教え...
-
ライム(果物)を漢字になおす...
-
インドの国旗とアイルランドの...
-
しらたきと吐き気
-
エクセルで数字を入力したら文...
-
パイナップル果汁はなぜ泡立ち...
-
切ったら梨の真ん中が茶色黒く...
-
ガーデンサラダとはどういうサ...
-
梶井基次郎の檸檬
-
10年前のにんにく漬け、食べて...
-
ローリエって何のために入れる...
-
エクセル 同名の場合はB列にC...
-
スーパーで買った1つ300円の梨...
-
ふにゃふにゃになったキウイっ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
7文字以上のフルーツをできるだ...
-
煮物こんにゃくの冷凍保存について
-
スポンジケーキってどのくらい...
-
「であり」と「であって」の使...
-
Excel MATCH関数で検索範囲内...
-
いちごを1パック買ったのです...
-
中黒「・」か読点「、」か?
-
ライム(果物)を漢字になおす...
-
エクセルで数字を入力したら文...
-
EXCELでB1に指定文字が入った場...
-
スーパーで買った1つ300円の梨...
-
離乳食にローリエ
-
外はふわふわで(柔らかい)、...
-
しらたきと吐き気
-
インドの国旗とアイルランドの...
-
ローリエって何のために入れる...
-
タンジェリンとオレンジの違い...
-
エクセル 同名の場合はB列にC...
-
果物が大嫌いな私、果物代わり...
-
カビのはえたイチゴ言うべきで...
おすすめ情報