2013-07-25 35 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位丢失。