如果你问这个,那么可能有几件事你不明白。
X & 0x08 = 8
让我们从最简单的部分开始:0x08。这只是十六进制的表示,这就是计算机程序员想知道单个字节包含什么时的想法。(如果你不知道字节是什么,那就为计算机内存字节
做个谷歌吧,这是一个很重要的概念。)
本例中,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 A B==0101 1111 A^B==0101 1010
所以...在X和0x08的情况下,0x08==0000 1000。你应该能从这里想出来。
问题是,有很多数字和给定的数字结合起来会得到相同的结果。按位运算并不像算术运算那样是可逆的。
但是,您可以找到一组可能的数字X来产生正确的结果。算法将是相当简单的(和语言不可知的)。
假设我们想要x&b==c
,其中b
是12,c
是8。您需要得到已知数和结果的二进制表示
b == 12 == 00001100
c == 8 == 00001000
X必须满足的规则如下:
c
中每一个等于1的位,b
和x
中的相应位必须等于1c
中等于0的位,如果b
中的对应位为1,则x
中的对应位必须为0。c
中等于0的位,如果b
中的对应位为0,则x
中对应位的值未知。根据这些规则,我们可以确定在我们的示例中
b == 12 == 00001100
c == 8 == 00001000
X == ????10??
在每个?
下,可以替换1或0,将得到正确的结果。例如,00001000
(8)和11111011
(251)都将是有效的解决方案。