1

紙でいくつかのテストを実行しましたが、どこにも確認が見つからないようです。

いくつかの一意の 8 ビット数値があり、それらを XOR して、どこかに保存するとします。その後、後で同じ数値とその格納された数値を xor した場合、常に 0 になりますか?

基本的に、操作を実行する前に満たす必要がある条件の列挙があります。健全性チェックとして、また誤って戻ってきて後でこのコードを壊さないようにするために、必要な条件を XOR して開始し、条件が満たされたときにその保存された値で条件を XOR することを検討していました。次に、操作が発生する直前に、0 に戻っていることを確認します。

だから何か

sanity_check = C1 ^ C3 ^ C5
...
//Condition one is met
sanity_check ^= C1
...
//Condition 3 is met
sanity_check ^= C3
...
//Condition 5 is met
sanity_check ^= C5
...
if( sanity_check == 0 )
 Do operation

適切な条件があれば、どこかで中間の 0 状態になる可能性があるため、完璧ではないことはわかっています。しかし、それは、将来、これらの条件の1つを誤って操作の下に移動することを防ぐためのガードとして、私自身が使用するためのものです.

4

3 に答える 3

6

はい、XOR は交換可能かつ結合的でありx ^ x == 0、 であるため、同じシーケンスをもう一度実行することで、XOR のシーケンスを元に戻すことができます。

于 2012-06-08T00:20:18.737 に答える
3

各ビットが条件を表すビット フィールドを使用することをお勧めします。

C1 = 1;  // 1 << 0
C2 = 2;  // 1 << 1
C3 = 4;  // 1 << 2
C4 = 8;  // 1 << 3
C5 = 16; // 1 << 4

// Condition one is met
sanity_check |= C1;

....

// If Conditions 1 2 and 4 passed
if((sanity_check & (C1 | C2 | C4)) == (C1 | C2 | C4))

// If Conditions 1 and 2 passed and 3 failed
if((sanity_check & (C1 | C2 | C3)) == (C1 | C2))

このようにして、チェックしたいコードのポイントに到達したときに、ビットごとの演算子を使用してさまざまな条件セットをチェックできます。また、(誤検出の可能性ではなく) すべての要件が満たされている場合にのみ、if ステートメントが入力されることが保証されます。

于 2012-06-08T00:22:46.627 に答える
1

はい。ダニエルの答えは、XOR が完全に可逆である理由を直感的に理解するための優れた基礎を提供します。これが常に当てはまることを確認したいという気持ちはわかります。うさぎの穴に向かう時が来ました!

2 進数 (つまり、他のすべてのもの) は、演算子intsと共にgroupと呼ばれるものを形成します。これは、 、および.^ints abc

  1. a ^ bも常にintです。
  2. a ^ b ^ c最初に計算するペアに関係なく、常に同じです。これが、Daniel が「連想」によって意味したものです。
  3. int( 0) があるのは0 ^ a = a ^ 0 = a. これは、 0 を an で XOR しintても変更されないという点で、同一性です。
  4. aあなたが選んだものには、常に、常に、常にその bようにa ^ b = b ^ a = 0. このような状況では、アイデンティティを与えるために中和するという点でb逆と呼ばれます。また、すべての数値に対してそのような逆数が1 つしかないことを証明することもできますが、それはしません。aa

ここで、特定の と のペアにはints^あなたの言うことを可能にする 2 つのプロパティがあります。

  1. a ^ b == b ^ a任意のa& b。これが、ダニエルが「可換」によって意味したものです。
  2. a ^ a = 0、つまり、 anintは に関してそれ自身の逆であることを意味し^ます。

これを使用して、式を例に取りましょう。すべての操作の後に得られる最終結果は次のとおりです。

C1 ^ C3 ^ C5 ^ C1 ^ C3 ^ C5

さて、可換性があるので、それらを切り替えてペアにすると、次のようになります。

C1 ^ C1 ^ C3 ^ C3 ^ C5 ^ C5

そして、結合性と自己逆のものにより、次のようになります。

(C1 ^ C1) ^ (C3 ^ C3) ^ (C5 ^ C5) = 0 ^ 0 ^ 0 = 0

同じ論理を使用して、任意の表現で自分を安心させることができます. これは常に真実です。中間の 0 を取得するという事実は問題ではありません。実際、値が何であるかは問題ではありません。数学はあなたをカバーしています。

于 2012-06-08T11:43:51.407 に答える