这就是我所做的:
93 | 199
返回
223
我理解这是因为0b1011101 | 0b11000111
是0b11011111
但是,假设我想进行反向操作。如何从0b1011101
和0b11000111
之间的按位操作中获取0b11011111
?
答案 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可以进行反向操作,因为它是非破坏性的。