提问者:小点点

对给定值进行按位and操作,从而得到所需的输出[关闭]


我想在下面提到的操作中确定X的值:

X & 0x08 = 8

在这种场景下如何找出x?


共2个答案

匿名用户

如果你问这个,那么可能有几件事你不明白。

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的位,bx中的相应位必须等于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)都将是有效的解决方案。