反转按位左移和OR赋值

Invert a bitwise left shift and OR assignment

本文关键字:OR 赋值 左移      更新时间:2023-10-16

这个反函数是什么?

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

当我已经有相应的A时,如何获得B

您永远无法完全恢复所有位。

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

示例:

10101101 << 3
Turns: 10101101
          ^---^
Into:  01101000
       ^---^

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

| 0x07填充底部的三个位(用111),所以即使你没有移位,你也会用111擦除最低的三个比特,使这些比特不可恢复。

现在,如果它是XOR’d而不是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 撤消

但是这种转换仍然会引起问题,即使它是异或的(事实并非如此)。

Given(以8位B为例,以0b为二进制形式,仅用于演示)

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

你可以得到相同的A,所以我认为你不能反向计算,最左边的3个比特丢失了。