这是我所做的:
93 | 199
返回
223
我知道这是因为0b1011101 | 0b11000111
等于0b11011111
但是,如果我想进行反向操作,如何从0b11000111
和0b11011111
的按位操作中获取0b1011101
?
这是我所做的:
93 | 199
返回
223
我知道这是因为0b1011101 | 0b11000111
等于0b11011111
但是,如果我想进行反向操作,如何从0b11000111
和0b11011111
的按位操作中获取0b1011101
?
在一般情况下,您无法得到明确的答案。如果C = A | B
,那么无论您在C和B中哪里有一个1,在A相应的位上,它可能是0或1都有可能。
以您的示例为例,93|199=223,但92|199也等于223。因此,对于给定的223和199,没有单一的答案(实际上,在这个示例中有32个可能的答案)。
唯一可逆操作是XOR,因为它是非破坏性的。
保留位频表
虽然仅通过位运算无法确定性地获取其他操作数,但这可能会有所帮助。
您可以保留一张表来存储位频率。然后,您想要从OR结果中删除的数字,需要减少该数字中“设置”(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个数字的按位OR,并且你想知道如果从集合中'去掉'某个数字X,那么OR会是什么。