这是我所做的:
93 | 199
返回
223
我明白这是0b1011101 | 0b11000111
因为0b11011111
但是,假设我想做相反的操作。如何从and0b1011101
之间的按位运算中得到?0b11000111
0b11011111
这是我所做的:
93 | 199
返回
223
我明白这是0b1011101 | 0b11000111
因为0b11011111
但是,假设我想做相反的操作。如何从and0b1011101
之间的按位运算中得到?0b11000111
0b11011111
在一般情况下,您无法得到明确的答案。如果C=A|B
,那么无论 C 中有 1,A 中有 1,B 的相应位都可能是0 或 1。
在您的示例中,93|199=223,但 92|199 也是 223。因此,给定 223 和 199,没有单一答案(实际上,在此示例中,有 32 个可能的答案)。
正如这里所指出的,OR 和 AND 都是破坏性操作。反转 OR 操作是一种有损操作,正如“jez”所提到的,可以有多个答案。所以,这是不可能的
XOR只能进行反向操作,因为它是非破坏性的。
保留位频率表
尽管没有确定性的方法可以仅使用按位运算来取回其他操作数,但这可能会有所帮助。
您可以保留一个表来存储位频率。然后,您要从 OR 结果中删除的数字,减少该数字的“设置”(1)位的频率。频率大于零的地方,在答案中“设置”这些位。
例子:
A : 0101
B : 1110
------------
OR : 1111
[frequency]
+-+-+-+-+
|1|2|1|1|
+-+-+-+-+
Now, you have the OR and B, you want to get A back.
Decrease the frequency table in indices where B has set bits.
[frequency-updated]
+-+-+-+-+
|0|1|0|1|
+-+-+-+-+
As you can see, the non-zero indices indicates where the A's bits were set.
此过程可以扩展到 N 个数字的集合,其中您有 N 个数字的按位 OR,并且您想知道“没有”集合中的某个数字 X 的 OR 是什么。