2013-07-25 64 views
7

對此的反函數是什麼?反轉按位左移和或分配

A = (B << 3) | 0x07; 

我怎樣才能得到一個B時,我已經有了相應的A

+1

所以你正在左移3並將低3位設置爲1? B =(A >> 3)'有什麼問題? (假設你意識到當你轉移時你輸了比特) – Nigel

回答

15

你永遠無法完全恢復所有的位。

B << 3將'B'移到左邊三位,並且它不循環。這意味着B的前三名位的狀態被擦除 - 除非你知道這些,你就不能夠恢復B.

例子:

10101101 << 3 

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

前三名位丟失,最下面的三個填滿了零。刪除的數據被刪除。

| 0x07填補了底部的三個位(與111),所以即使你沒有轉移,你會用111被擦除最低三個位,使得這些位是無法挽救的。

現在,如果有人進行XOR運算,而不是或運算,這將會是可恢復的另一個XOR:

A^same-value可以與另一A^same-value因爲((A^B)^B) == A

A | same-value不能被撤消與另一個A | same-value

A | same-value不能被撤消ne與AND:A & same-value

但是,這種轉變仍然會導致問題,即使它是異或(它不是)。

+2

正確,你輸掉了前三名。即使最初的功能被改變爲左旋,你仍然會失去信息,因爲'|無論如何,0x07'設置最右邊的三位。 – Anthony

1

鑑於(使用8位B爲例,使用0b爲二進制形式,僅用於演示)

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

你可以得到相同的A,所以我不認爲你可以扭轉計算,最左邊的3位丟失。