使用给定的值进行按位和运算,从而产生所需的输出

问题描述

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

X & 0x08 = 8

在这种情况下如何找出 x?

解决方法

问题是有许多数字与给定数字组合会给你相同的结果。按位运算并不像算术运算那样真正可逆。
但是,您可以找到一组可能产生正确结果的数字 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) 都是有效的解决方案。

,

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

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。你应该可以从这里弄清楚。