2

アルゴリズムに問題があります。

XorAndXorというメソッドで特定のビットを設定できるIOに使用されるバイトがあります。アルゴリズムは次のように機能します。

newValue = (((currentValue XOR xorMask1) AND andMask) XOR xorMask2)

説明は次のとおりです。

両方の xor-mask の値が同じ場合、この関数は、and-mask が 1 であるビット位置に xor-mask のビットを挿入します。他のビットは変更されません。

したがって、この関数に期待するのは、次のバイトがある場合です。xor マスクと and マスクの両方00101101に使用すると、2 番目のビットのみが 1 に設定され、結果は.0100000001101101

ただし、数学を実行して関数を実行すると、結果は00000000.

私は何が間違っているのですか、それともこの機能について私が理解できない何かがありますか? この種の低レベルのプログラミングは久しぶりなので、これが頻繁に使用される方法論なのか、なぜ、どのように使用すべきなのか、よくわかりません。

この簡単な質問をさせてください:この関数を効果的に使用して単一のビットを設定 (または設定解除/変更) する方法はありますか (現在の値を具体的に尋ねることなく)。

例:現在の値は00101101(わかりません) ですが、2 番目のビットが設定されていることを確認したいだけなので、結果は01101101.

重要な情報私のドキュメント PDF では、XOR と最初の xorMask1 の間に少しスペースがあるようです。そのため、これは~または!またはその他の否定記号があった場所である可能性があり、いくつかの奇妙なエンコーディングの問題のために失われる可能性が非常に高いです. したがって、関数がドキュメントの内容または関数宣言の内容を実行するかどうかをテストします。ヘルメットをかぶって、結果を投稿します(ドラムをお願いします)....

4

7 に答える 7

4
     00101101 
XOR  01000000
-------------
     01101101
AND  01000000
-------------
     01000000 
XOR  01000000
-------------
     00000000

ドキュメントが正しくありません。最初の実装から完全に逸脱した実装を見るのはこれが初めてではありませんが、誰もわざわざドキュメントを更新しませんでした。

簡単なチェックを行ったので、間違っている可能性がありますが、以下はドキュメントと一致します。

newValue = (((currentValue XOR xorMask1) AND ~andMask) XOR xorMask2)

     00101101 
XOR  01100100
-------------
     01001001
AND  10011011
-------------
     00001001 
XOR  01100100
-------------
     01101101

式の論理テーブルは次のとおりですNew = Curr XOR Xor1 AND ~And XOR Xor2Xor1 == Xor2

CURR: 0 1 0 1   0 1 0 1 
XOR1: 0 0 1 1   0 0 1 1
AND:  0 0 0 0   1 1 1 1 
XOR2: 0 0 1 1   0 0 1 1 
-----------------------
NEW:  0 1 0 1   0 0 1 1 
      ---v---   ---v---
      same as   same as  
      current   xor mask
      where     where
      AND = 0   AND = 1
于 2012-10-01T12:19:21.203 に答える
2

私はこれをしばらく研究してきましたが、他の人が理解していないことがわかったと思います。XOR AND XOR プロセスは、他に影響を与えずに複数のバイトを設定するのに役立ちます。例として、1x1x xxx0 に設定したい特定のバイトがあり、x は気にしない値です。XOR AND XOR プロセスを使用して、次のマスクを使用して、重要でないビットをオンまたはオフにします。XOR マスクを使用してビットをオンにし、AND マスクを使用してビットをオフにします。マスクに関係のないものはデフォルト値 (XOR マスク [x XOR 0 = x] および 1 の場合は 0) のままにします。 AND マスクの場合 [x AND 1 = x])。したがって、目的の値が与えられると、マスクは次のようになります。

XOR: 10100000
AND: 01011110

ミステリー ビットが 10010101 の場合、計算は次のようになります。

10010101
10100000 XOR
00110101 =
01011110 AND
00010100 =
10100000 XOR
10110100 =

前の状態に関係なく、オンにしたいビットはオンになり、オフにしたいビットはオフになります。

これは、複数のビットを管理するための便利なロジックです。

編集: 最後の XOR はトグル用です。変更する必要があることがわかっているビットがある場合は、それを 1 にします。つまり、3 番目のビットを切り替えたいとします。そうしないと、マスクは次のようになります。

XOR1 10100000
AND  01011110
XOR2 10100100

最後のインタラクションは次のように変わります

00010100 =
10100100 XOR
10110000 =

3 番目のビットがトグルされます。

于 2012-10-05T16:18:53.360 に答える
1

あなたの非常に単純な質問に答えるために、これは少し設定する方法です:

value |=  0x100;  

これは少しクリアする方法です:

value &= ~0x100;

この例0x100では000100000000バイナリであるため、ビット8(右から数えて)を設定/クリアしています。

他の人は、あなたのコードサンプルがそれが主張することをどのように行わないかをすでに指摘しているので、それについてはこれ以上詳しく説明しません。

于 2012-10-01T12:32:48.420 に答える
0

自分で真理値表を作成し、1 と 0 をたどってプロセスを進めます。

  • Xor 0 はすべて変更されません (1 Xor 0 は 1 です; 0 Xor 0 は 0 です)。
  • Xor 1 はすべて反転されます (1 Xor 1 は 0、0 Xor 1 は 1)。
  • Anding の場合、And マスクに 1 ビットがある場合を除き、すべてが 0 になります。それらは変更されません。

したがって、最初の Xor は左から 2 番目のビットのみを変更できます。これは、マスクに 1 があるためです。そのビットを 0 から 1 に反転します。And はそのビットをそのままにし、他のすべてを 0 に設定します。2 番目の Xor は 1 を 0 に反転し、他のすべてを変更しません。

結果:あなたが言ったようにすべてゼロ。

Xor と And のどの組み合わせがドキュメントに記載されている動作を提供するかという質問はありますか? 1 つのビットだけをオンにするには、ビットごとの Or を使用します。マスクにはそのビット 1 だけがあり、他のビットは 0 です。1 ビットだけをオフにするには、bitwise And を使用します。ここで、マスクにはそのビット 0 だけがあり、他は 1 です。これは面倒で、多くのテストがあるため、2 ビットをオンにして 3 ビットをオフにしたい場合は、この種のトリックの多くは "if" 処理を節約しますが、1 つのビットだけに影響を与えたい場合は、単純な方法で実行し、この関数を無視してください。

于 2012-10-01T12:20:22.857 に答える
0

XOR は排他的論理和です。これは、どちらか一方を意味しますが、両方ではなく、どちらでもないという意味です。ウィキペディアの真理値表です。

Input
A | B    Output
---------------
0 | 0 |  0
0 | 1 |  1
1 | 0 |  1
1 | 1 |  0

currentValue XOR xorMask1 = 
    00101101 xor 01000000 = 01101101

01010010 AND andMask = 
    01101101 and 01000000 = 01000000

01000000 XOR xorMask2 = 
    01000000 xor 01000000 = 00000000
于 2012-10-01T12:21:11.147 に答える
0

XOR は排他的バイナリであり、いずれかのビットが 1 に設定されている場合にのみ true を返します。したがって、次のようになります。

00101101 XOR 01000000 = 01101101
01101101 AND 01000000 = 01000000
01000000 XOR 01000000 = 00000000
于 2012-10-01T12:21:38.303 に答える
0
p|q|r|s|p^q|(p^q)&r|((p^q)&r)^s|
0|0|0|0| 0 |   0   |     0     |
0|0|0|1| 0 |   0   |     1     |
0|0|1|0| 0 |   0   |     0     |
0|0|1|1| 0 |   0   |     1     |
0|1|0|0| 1 |   0   |     0     |
0|1|0|1| 1 |   0   |     1     |
0|1|1|0| 1 |   1   |     1     |
0|1|1|1| 1 |   1   |     0     |
1|0|0|0| 1 |   0   |     0     |
1|0|0|1| 1 |   0   |     1     |
1|0|1|0| 1 |   1   |     1     |
1|0|1|1| 1 |   1   |     0     |
1|1|0|0| 0 |   0   |     0     |
1|1|0|1| 0 |   0   |     1     |
1|1|1|0| 0 |   0   |     0     |
1|1|1|1| 0 |   0   |     1     |

この表でビットの入力値を確認し、出力を確認してください。出力のニーズに合わせて、それに応じてマスクを変更します。

于 2012-10-01T12:22:03.043 に答える