问题描述
我想在下面提到的操作中确定 X 的值:
X & 0x08 = 8
在这种情况下如何找出 x?
解决方法
问题是有许多数字与给定数字组合会给你相同的结果。按位运算并不像算术运算那样真正可逆。
但是,您可以找到一组可能产生正确结果的数字 X。其算法非常简单(并且与语言无关)。
假设我们想要 X & b == c
,其中 b
是 12,c
是 8。您需要获得已知数和结果的二进制表示
b == 12 == 00001100
c == 8 == 00001000
X 必须满足的规则如下:
- 对于
c
中每一个等于1的位,b
和X
中对应的位必须等于1 - 对于
c
中等于 0 的位,如果b
中的对应位为 1,则X
中的对应位必须为 0。 - 对于
c
中等于 0 的位,如果b
中的对应位为 0,则X
中对应位的值未知。
根据这些规则,我们可以确定在我们的示例中
b == 12 == 00001100
c == 8 == 00001000
X == ????10??
在每个 ?
下,您可以替换为 1 或 0,您将得到正确的结果。例如,00001000
(8) 和 11111011
(251) 都是有效的解决方案。
如果你问这个,那么可能有几件事你不明白。
X & 0x08 = 8
让我们从最简单的部分开始:0x08。这只是十六进制表示,这是计算机程序员在想知道单个字节包含什么时的想法。 (如果您不知道字节是什么,请谷歌搜索 computer memory byte
。这是一个非常重要的概念。)
在这种情况下,0x08 只是一个普通的 8。在二进制中,这意味着 0000 1000。正好设置了一位。
现在让我们做 & 符号。在这种情况下,它代表按位与。 (如果您不知道比特是什么,请继续阅读比特和字节。比特是字节中的单个二进制数字。0 或 1。)
有一些基本的位操作。
& -- AND -- the corresponding bit in both numbers is set
| -- OR -- if either is set
^ -- XOR -- exclusive or -- one or the other is set
因此,如果我们有两个数字 A 和 B,如下所示:
A 0101 0101
B 0000 1111
那么: A & B == 0000 0101 一个 |乙 == 0101 1111 A ^ B == 0101 1010
所以...在 X & 0x08 的情况下,0x08 == 0000 1000。你应该可以从这里弄清楚。