8

这是我所做的:

93 | 199

返回

223

我明白这是0b1011101 | 0b11000111因为0b11011111

但是,假设我想做相反的操作。如何从and0b1011101之间的按位运算中得到?0b110001110b11011111

4

3 回答 3

19

在一般情况下,您无法得到明确的答案。如果C=A|B,那么无论 C 中有 1,A 中有 1,B 的相应位都可能是0 或 1。

在您的示例中,93|199=223,但 92|199 也是 223。因此,给定 223 和 199,没有单一答案(实际上,在此示例中,有 32 个可能的答案)。

于 2014-11-04T03:06:16.310 回答
2

正如这里所指出的,OR 和 AND 都是破坏性操作。反转 OR 操作是一种有损操作,正如“jez”所提到的,可以有多个答案。所以,这是不可能的

XOR只能进行反向操作,因为它是非破坏性的

于 2017-01-02T09:20:53.210 回答
1

保留位频率表

尽管没有确定性的方法可以仅使用按位运算来取回其他操作数,但这可能会有所帮助。

您可以保留一个表来存储位频率。然后,您要从 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 是什么。

于 2020-04-19T14:43:54.987 回答