如何反转按位OR运算?

时间:2014-11-04 03:02:22

标签: python bit-manipulation bitwise-operators bitwise-or

这就是我所做的:

93 | 199

返回

223

我理解这是因为0b1011101 | 0b110001110b11011111

但是,假设我想进行反向操作。如何从0b10111010b11000111之间的按位操作中获取0b11011111

3 个答案:

答案 0 :(得分:13)

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

在你的例子中,93 | 199 = 223,但92 | 199也是223.所以,鉴于223和199,没有单一答案(事实上,在这个例子中有32个可能的答案)。

答案 1 :(得分:1)

保留位频率表

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

您可以保留一个表来存储位频率。然后,要从“或”结果中删除的数字,降低该数字被“置位”(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个数字的按位或,并且您想知道该集合中“不”有某个数字X的“或”是什么。

答案 2 :(得分:0)

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

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