xor の仕組み。 VBA 論理演算子。 パルスのエッジとカットオフを識別するためのスキーム

C++。 論理演算。 ビット単位の論理演算。 シフト操作。 XOR演算

1. 論理演算、ビット論理演算、シフト演算はどのような型に使用できますか?

論理演算、ビットごとの論理演算、およびシフト演算は、整数型のオペランドでのみ使用できます。

2. C/C++ ではどのような論理演算が使用されますか?

C/C++ プログラミング言語では、次の論理演算が使用されます。

  • && – 論理「AND」;
  • || – 論理「OR」;
  • ! – 論理的には「いいえ」。

論理演算の結果は、値 false または true です。 C++ では、false は 0、true は 1 とみなされます。

このことから、誤りであると結論付けることができます< true . Например:

// 論理演算ブール値; レス = 偽< true ; // res = true
3. 論理演算の真理値表

論理演算の真理値表 && (論理「AND」)、 || (論理「OR」)、 ! (論理「NO」) は次の形式になります。

C/C++ では、false は 0 であるとみなされ、true は 0 ではありません (ゼロ以外の整数値)。

4. C++ での論理演算の使用例

例1.ブール式と組み合わせた論理演算

// 論理演算ブール値; int a、b; // 演算 && (AND) a = 8; b = 5; レス = a && b; // res = True a = 0; レス = a && b; // res = False // 操作 || (または) a = 0; b = 0; レス = a || b; // res = False b = 7; レス = a || b; // res = True // 手術! (論理的に「いいえ」) a = 0; レス = !a; // res = True a = 15; レス = !a; // res = False

例2。条件式での論理演算。 以下は、if ステートメントで論理演算が使用されているコードの一部です。

// 条件式内の論理演算 int a、b; ブール値; a = 0; b = 3; レス = 偽 ; if (a && b) res = true ; // res = false a = 0; b = 7; if (a || b) res = true ; // レス = true
5. C/C++ ではどのようなビット単位の論理演算が使用されますか?

C/C++ 言語は、次のビット単位をサポートします。 論理演算:

  • & – ビット単位の論理積 (AND)。
  • ^ – ビットごとの加算モジュロ 2 (XOR - 排他的 OR)。
  • | – ビット単位の論理和 (OR);
  • ~ – ビット単位の反転 (NOT)。

演算 & 、 ^ 、 | バイナリです。 これは、2 つのオペランドが必要であることを意味します。 オペランドのビットは次のように相互に比較されます。 ルール: 第 1 オペランドの位置 0 のビットが第 2 オペランドの位置 0 のビットと比較されます。 次に、最初のオペランドの位置 1 のビットが 2 番目のオペランドの位置 1 のビットと比較されます。 これは、整数オペランドのすべてのビットを比較します。

6. ビットごとの論理演算の真理値表

結果の各ビットは、表に示すビットである 2 つのオペランドに基づいて決定されます。

反転には、~ 記号の右側に 1 つのオペランドが必要です。 結果は、オペランドのすべてのビットをビットごとに反転することによって得られます。

7. ビット単位の論理演算の例

unsigned short int 型の 2 つの数値 17 と 45 が与えられたとします。 各数値はメモリ内で 1 バイトまたは 8 ビットを占有します。 以下は、各ビット単位の演算で計算がどのように行われるかを示す例です。

この例からわかるように、指定された演算が各ビットに対して実行されます。

8. C/C++ ではどのようなシフト演算が使用されますか?

C/C++ 言語には 2 つのビット単位の演算が含まれています シフト:

  • << – オペランド値を指定されたビット数だけ左にシフトします。 オペランドは演算記号の左側に配置されます。 シフトされるビット数は演算記号の右側に示されています。
  • >> – オペランド値を指定されたビット数だけ右にシフトします。 オペランドは演算記号の左側に配置されます (<<). シフトされるビット数は演算記号の右側に表示されます。

描画ビットは失われ、ゼロ ビットが「入力」されます。 オペランドを 1、2、3 桁以上左にシフトするのが、2、4、8、... で乗算する最も速い方法です。 オペランドを 1、2、3 桁以上右にシフトするのが、最も速く除算できます。 2、4、8、... までに

プログラムで整数オペランドを 2、4、8 などで乗算する演算が必要な場合。 できるだけ早く発生した場合は、左シフト操作を使用することをお勧めします。

これは、整数オペランドを 2、4、8 などですばやく除算する必要がある場合にも当てはまります。 このような場合は、右シフトを使用することをお勧めします。

9. プログラム内でのシフト演算の使用例
// シフト操作 int a; int b; int c; a = 15; b = -5; // 左シフト - 乗算 c = a<< 1; // c = a * 2^1 = 30 c = b << 2; // c = b * 2^2 = -20 // 右シフト - 除算 c = a >> 3; // c = a / 2^3 = 1 c = b >> 1; // c = b / 2^1 = -3
10. 論理演算とビット単位の論理演算の違いは何ですか?

論理演算は、2 つのオペランドの値全体を比較します。 各オペランドは true または false にすることができます。 C/C++ 言語では、整数であるオペランドの比較が可能です。 この場合、整数値 0 は値 false に対応し、ゼロ以外の (その他の) 値は値 true に対応します。

それらが実行する機能は、AND 要素または OR 要素の場合よりも多少複雑です。 XOR ゲートのすべての入力は等しいですが、出力を 1 または 0 に設定することによって他の入力をブロックすることはできません。 表4.1。 真理値表 2入力の排他的論理和要素
入力1 入口2 出口
0 0 0
0 1 1
1 0 1
1 1 0


米。 4.1.

排他的 OR 関数は次のことを意味します。1 つの入力のみが 1 を持つ場合、出力には 1 が表示されます。 入力に ​​2 つ以上の 1 がある場合、またはすべての入力が 0 の場合、出力は 0 になります。 真理値表 2入力要素をテーブル内で排他的論理和をとります。 4.1. 国内外の制度で採用されている名称を図に示します。 4.1. 排他的論理和「=1」要素の国内指定の記述は、入力にユニットが 1 つだけある場合の状況が強調表示されていることを意味します。

標準シリーズには XOR 要素がほとんどありません。 国内シリーズは、LP5 マイクロ回路 (2C 出力を備えた 4 つの 2 入力要素)、LL3 および LP12 を提供しますが、OK 出力が LP5 とは異なります。 あまりにも特殊な機能がこれらの要素によって実装されます。

数学的な観点から見ると、XOR 要素はいわゆるモジュロ 2 加算の演算を実行するため、これらの要素はモジュロ 2 加算器とも呼ばれます。 前回の講義で述べたように、2 を法とする和は円で囲まれたプラス記号で示されます。

要素の主な用途は排他的論理和であり、これは次の式から直接続きます。 真理値表、2 つの入力信号を比較することで構成されます。 2 つの 1 または 2 つの 0 が入力に到着する (信号が一致する) 場合、出力では 0 が形成されます (表 4.1 を参照)。 通常、このアプリケーションでは、一定のレベルが要素の一方の入力に適用され、もう一方の入力に到着する時間とともに変化する信号が比較されます。 しかし、より多くの場合、信号とコードを比較するために特別なマイクロ回路が使用されます。 コードコンパレータ、これについては次の講義で説明します。

XOR 要素は、モジュロ 2 加算器として、巡回チェックサムの計算に使用される並列および直列のモジュロ 2 除算器でも使用されます。 ただし、これらのスキームについては、講義 14、15 で詳しく説明します。

XOR 要素の重要な用途は、制御されたインバーターです (図 4.2)。 この場合、要素入力の 1 つは制御入力として使用され、情報信号はもう 1 つの要素入力で受信されます。 制御入力が 1 の場合、入力信号は反転されますが、0 の場合は反転されません。 もっと頻繁に 制御信号は一定レベルに設定され、素子の動作モードを決定し、情報信号がパルス化されます。 つまり、XOR 要素は、入力信号またはエッジの極性を変更する場合もあれば、変更しない場合もあります。 制御信号.


米。 4.2.

同じ極性(正または負)の信号が 2 つあり、それらの同時到来が除外される場合、排他的論理和要素を使用してこれらの信号を混合できます(図 4.3)。 入力信号の極性を問わず、エレメントの出力信号は正になります。 正の入力信号の場合、XOR ゲートは 2OR ゲートとして機能し、負の入力信号の場合、2AND-NOT ゲートの代わりになります。 このような置換は、回路内で一部の排他的 OR 要素が未使用のままになっている場合に役立ちます。 確かに、次のことを考慮する必要があります。 伝播遅延 XOR 要素の信号は、通常、最も単純な AND、NAND、OR、NOR 要素の遅延よりわずかに大きくなります (約 1.5 倍)。

実際には、最も一般的に使用される 2 入力要素は「排他的 OR」です。 図では、 図 1 は、反転を行わない従来の要素のグラフィック表示とその状態テーブルを示しています。 簡単に言えば、この要素の本質は次のとおりです。出力信号は、入力の論理レベルが同じでない場合にのみ表示されます。

パルスのエッジとカットオフを識別するためのスキーム

この回路では、パルスを遅延させるために 3 つの XOR ゲートが使用されます。 DD1.4 - 合計。 出力パルスには安定した立ち上がりエッジと立ち下がりエッジがあります。 各出力パルスの持続時間は、3 つの要素のそれぞれのスイッ​​チング遅延時間の 3 倍に等しくなります。 出力パルスのエッジ間の時間間隔は、入力パルスの持続時間と等しくなります。 このデバイスは入力信号の周波数も 2 倍にします。

「排他的論理和」と呼ばれるもう 1 つの興味深いプロパティがあります。 定数「0」が入力の 1 つに適用されると、要素の出力の信号は入力信号を繰り返し、定数「0」が定数「1」に変更されると、出力信号はすでに入力信号の反転になっています。

場合によっては、個々の標準論理ゲートから「排他的 OR」ゲートを取得することが必要になることがあります。 例としては、4 つの 2-AND-NOT 要素に実装された「排他的 OR」要素回路があります。 図 3 は、4 つの状態の XOR 回路を示しています。 これは、使用される各 2-NAND 論理ゲートで考えられるすべての論理レベルを示しています。

このような要素が図に含まれています。 この回路では、「排他的 OR」要素は、K561LA7 マイクロ回路の 1 つのパッケージに含まれる 4 つの 2-AND-NOT 要素で構成されています。

差周波を備えたディスクリート信号発生器

ドライバ回路を図 4 に示します。ここでは、排他的 OR 論理要素も 4 つの 2-AND-NOT 要素に実装されています。

方形パルスはシェイパーの入力 1 と 2 に入力されます (グラフ 1 と 2 を参照)。これらは繰り返し周波数が異なります。 論理要素 DD1.1 ~ DDI.4 に基づくノードは、これらの信号を乗算します。 素子 DD1.4 からの出力パルス信号 (グラフ 3) は積分回路 R3、C1 に供給され、入力信号の周波数の差に等しい周波数を持つ三角波信号 (グラフ 4) に変換されます。 -アンプ DA1 は受信信号を方形波に変換します (スケジュール 5 を参照)。 抵抗 R1 は、出力信号の正と負の半波の持続時間を調整します。 とても興味深い計画です。 ラジオデザイナーは考えるべきことがある。 たとえば、3 番目のグラフに示されている信号は正弦波 PWM 信号です。
もちろん、「排他的論理和」要素の使用範囲はさらに広くなります。 私の意見では、ここでアマチュア無線家にとってより興味深いものを紹介しました。

この記事では、いくつかのビット演算について説明します。 主なものである XOR (排他的 OR)、AND、NOT、OR を見てみましょう。

知られているように、情報の最小測定単位は 少し、次の 2 つの値のいずれかを格納します: 0 ( 間違い、 false) または 1 ( 真実、 真実)。 したがって、ビット セルは一度に 2 つの可能な状態のうち 1 つのみになることができます。

ビットを操作するには、特定の操作が使用されます。 論理値またはブール値。 これらは、値が 0 か 1 かに関係なく、任意のビットに適用できます。 それでは、3 つの基本的な論理演算の使用例を見てみましょう。

論理演算 AND (アンド)

そして&で表されます。

AND 演算子は 2 ビットに対して実行されます。例として a と b を考えてみましょう。 a と b が 1 に等しい場合、AND 演算の結果は 1 になります。それ以外の場合、結果は 0 になります。たとえば、AND を使用すると、数値が偶数であるかどうかを確認できます。

AND 演算の真理表を見てください。

論理演算 OR(オア)

|で示されます 。

オペレーター または 2 ビット (a と b) でも実行されます。 a と b が 0 の場合、結果は 0 になります。それ以外の場合、結果は 1 になります。真理値表を見てください。

論理演算 XOR (排他的論理和)

XOR 演算子は ^ で表されます。

XOR 2 ビット (a と b) で実行されます。 XOR 演算の結果 ( 排他的論理和) は、ビット b または a のいずれかが 1 の場合に 1 になります。それ以外の場合、XOR 演算子を適用した結果は 0 になります。

XOR (排他的 OR) の論理演算真理値表は次のようになります。

XOR(排他的論理和)を使用すると、一時変数を使用せずに、同じデータ型の 2 つの変数の値を変更できます。 たとえば、XOR を使用してテキストを暗号化することもできます。

String msg = "これはメッセージです"; 文字メッセージ = msg.toCharArray(); 文字列キー = ".*)"; String encryptedString = new String(); for(int i = 0; i< message.length; i++){ encryptedString += message[i]^key.toCharArray(); }

XOR が最も信頼性の高い暗号化方法とは程遠いことに同意しますが、これは、XOR をどの暗号化アルゴリズムの一部としても使用できないという意味ではありません。

論理演算 NOT (NOT)

これはビット単位の否定であるため、1 ビットで実行され、 ~ で示されます。

結果はビットの状態によって異なります。 ゼロ状態の場合、演算の結果は 1 になり、その逆も同様です。 すべてが非常にシンプルです。

これら 4 つの論理演算を最初に覚えておく必要があります。これらの演算を使用すると、ほぼすべての可能な結果を​​得ることができるからです。 などの操作もあります<< (побитовый сдвиг влево) и >> (ビット単位の右シフト)。

アセンブリ言語の XOR 命令は、2 つのオペランドのすべてのビットの間で排他的 OR 演算を実行します。 XOR 演算の結果は、最初のオペランドに書き込まれます。 構文:

XOR レシーバー、ソース

XOR 命令は常に CF と OF をリセットし、また (結果に応じて) SF、ZF、および PF フラグを変更します。 AF フラグの値は任意であり、操作の結果には依存しません。

受信者は次のいずれかになります。

  • メモリ領域(MEM)

SOURCE は次のいずれかになります。

  • メモリ領域(MEM)
  • 汎用レジスタ(REG)
  • 即値 - 定数 (IMM)

上記の制限に従って、RECEIVER と SOURCE の組み合わせは次のようになります。

REG、MEM MEM、REG REG、REG MEM、IMM REG、IMM

排他的論理和演算

排他的 OR 演算を実行する場合、比較されるビットが異なる (等しくない) 場合、結果の値は 1 になります。 比較されたビットの値が同じ場合、結果は 0 になります。

このため、この操作は排他的と呼ばれます。 比較から同一ビットを除外し、等しくないビットに対して演算を実行します。

ただし、等しくないビットのペアは 0 と 1 であるため、論理 OR 演算の結果は 1 になります。

排他的論理和真理値表

XOR 真理値表を以下に示します。

0 XOR 0 = 0 0 XOR 1 = 1 1 XOR 0 = 1 1 XOR 1 = 0

XOR演算の特徴

XOR 演算には可逆性の特性があります。 同じオペランドで2回実行すると結果の値が反転します。 つまり、この操作をビット間で 2 回実行すると、 バツそして Y、最終結果では元のビット値を取得します。 バツ.

0 XOR 0 = 0 XOR 0 = 0 0 XOR 1 = 1 XOR 1 = 0 1 XOR 0 = 1 XOR 0 = 1 1 XOR 1 = 0 XOR 1 = 1

このプロパティは、たとえば、単純なデータ暗号化に使用できます (これについては、別の機会に詳しく説明します)。

XOR演算後のパリティフラグのチェック

XOR コマンドは、8 ビット、16 ビット、および 32 ビットの演算で機能します。

場合によっては、演算を実行した後、パリティ フラグ PF をチェックして、1 ビット (偶数または奇数) がいくつ含まれているかを確認する必要があります。 下位バイト result (これは、XOR 演算を実行する場合だけでなく、他の算術演算および論理演算を実行する場合にも必要です)。

パリティ フラグが設定されている場合、結果は偶数の 1 ビットになります。 それ以外の場合、フラグはリセットされます。

結果の値を変更せずに、単純に任意の数値のパリティをチェックすることもできます。 これを行うには、ゼロ値を指定して XOR コマンドを実行する必要があります。 つまり、RECEIVER にはテスト対象の数値が含まれ、SOURCE にはゼロが含まれている必要があります。 次に、パリティフラグを確認する必要があります。 例:

AL, 10110101b ; AL に奇数の 1 ビットの数値を入れます (5) XOR AL, 0 ; この場合、パリティフラグ PF は設定されません (PO) MOV AL, 10110111b ; AL に数値を入れます偶数の 1 ビット (6 ) XOR AL, 0 ; この場合、パリティ フラグ PF がセットされます (PE)

デバッガでは通常、結果の結果に含まれる 1 の数が偶数であることを示すために PE (パリティ偶数) という略語が使用され、奇数を示すために PO (パリティ奇数) が使用されます。

16ビットワードのパリティ

すでに述べたように、パリティ フラグは、結果の下位バイトに含まれる 1 の数に応じて設定されます。 16 ビット オペランドのパリティをチェックするには、数値の上位バイトと下位バイトの XOR を計算する必要があります。

MOV AX, 64C1h ;0110 0100 1100 0001 - 6 つの 1 ビット XOR AH, AL ;パリティ フラグが設定されます

この単純な方法では、16 ビット オペランドが 2 バイト (8 ビットの 2 つのグループ) に分割され、XOR コマンドを実行するときに、2 つの 8 ビット オペランドの対応するビットにある 1 ビットは取り込まれません。アカウント。 結果の対応するビットがゼロであるためです。

XOR 命令は、2 つの 8 ビット オペランドの重複する 1 ビットを結果から削除し、互いに素な 1 ビットを結果に追加します。 つまり、受信する 8 ビット数値のパリティは、元の 16 ビット数値のパリティと同じになります。

0110 0100 1100 0001 - 元の 16 ビット数値 0 XOR 1 = 1 1 XOR 1 = 0 1 XOR 0 = 1 0 XOR 0 = 0 0 XOR 0 = 0 1 XOR 0 = 1 0 XOR 0 = 0 0 XOR 1 = 1

結果は 4 単位になります。つまり、PF フラグが設定されます。

32ビットダブルワードのパリティ

では、32 ビット数値のパリティを決定する必要がある場合はどうすればよいでしょうか?

次に、数値が 4 バイトに分割され、これらのバイトに対して排他的論理和演算が 1 つずつ実行されます。

たとえば、32 ビット数値を分割します。 B 4バイトずつ B0, B1, B2, B3、 どこ B0- これは下位バイトです。

次に、数値 B のパリティを決定するには、次の式を使用する必要があります。

B0 XOR B1 XOR B2 XOR B3

しかし、アセンブラではそのような表記は許可されません。 したがって、少し考える必要があります。

そして最後に、記憶術の起源について XOR。 英語にはeという単語があります バツ受付 - 例外。 この単語の略語は手紙です バツ(それが起こった経緯です)。 おそらく、広告や、メーカーが独占性を主張している (または主張していると思われる) 製品の名前でこれを見たことがあるでしょう。 たとえば、Lada XRAY、Sony XPeria などです。 したがって、XOR は 2 つの単語で構成される頭字語です - e バツ受付 または- 排他的論理和。

トピックの続き:
スマートテレビ

カーラジオ用電話用 FM トランスミッター プロ、電話 FM トランスミッター プロは、携帯電話を車に接続する便利で効率的な方法です。

新しい記事
/
人気のある