反转按位左移和OR分配

时间:2013-07-25 01:40:06

标签: c++ c bit-manipulation bit-shift or-operator

这是什么反函数?

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

如果我已经拥有相应的B

,如何获得A

2 个答案:

答案 0 :(得分:15)

你无法完全恢复所有位。

B << 3向左移动'B'三位,并且它不会循环。这意味着B的前三位的状态被删除 - 除非你知道那些,否则你将无法恢复B.

示例:

10101101 << 3

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

前三位丢失,底三位用零填充。删除的数据将被删除。

| 0x07填充底部的三位(111),所以即使你没有移位,你也会用111删除最低的三位,比特无法恢复。

现在,如果它是XOR而不是OR'd,它可以通过另一个XOR恢复:

A ^ same-value 可以与其他A ^ same-value撤消,因为((A ^ B) ^ B) == A

A | same-value 无法撤消其他A | same-value

A | same-value 无法撤消AND:A & same-value

但是这种转变仍会导致问题,即使它是异或(它不是)。

答案 1 :(得分:1)

给定(以8位B为例,使用0b表示二进制形式,仅演示)

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

你可以得到相同的A,所以我认为你不能反转计算,最左边的3位会丢失。

相关问题