2013-07-25 7 views
7

これに対して逆関数は何でしょうか?ビット単位の左シフトとORの代入を逆にする

A = (B << 3) | 0x07; 
私は B私は既に持って対応する Aを取得できますか

+1

左に3をシフトし、下位の3ビットを1に設定していますか? 'B =(A >> 3)'の何が間違っていますか? (あなたがシフト時にビットを失うことを理解していると仮定した場合) – Nigel

答えて

15

すべてのビットを完全に回復することはできません。

B << 3左に3ビットシフトし、ループしません。これは、Bの上位3ビットの状態が消去されることを意味 - あなたがそれらを知っている限り、あなたはBを回復することはできません

例:

10101101 << 3 

Turns: 10101101 
      ^---^ 
Into: 01101000 
     ^---^ 

上位3ビットが失われ、下の3つは0で埋められます。削除されたデータは削除されます。

| 0x07は(111で)下の3つのビットを埋め、あなたがシフトしていない場合でも、あなたはそれらのビットが回収不能作り、111で最下位の3ビットを消去することと思います。それは論理和の代わりにXORされた場合

今は、別のXORと、回復するだろう:((A^B)^B) == A

A | same-valueができないため、

A^same-valueは別のA^same-valueを元に戻すことができます他とやり直しますA | same-value

A | same-valueは元に戻すことはできませんA & same-value

しかし、シフトがXORされていても(まだそうではないにしても)、問題が発生します。 、与えられた

+2

正解、あなたは上位3ビットを失う。初期の関数が左回転に変更されたとしても、 '|とにかく右端の3ビットを設定しています。 – Anthony

1

B = 0b00000000 
B = 0b00100000 
//... 
B = 0b11100000 

あなたは同じAを得ることができます(デモのみが、バイナリ形式のため0bを使用して、一例として、8ビットBを使用して)ので、私はあなたが計算を逆にすることができないと思います左端の3ビットが失われます。

関連する問題