x和(-x)在2的补语中的意义?

Tho*_*ind 6 bit-manipulation bit twos-complement bitwise-and

其中' - '表示负x,'&'表示按位AND.

这些数字在程序中是8位2的补码,我似乎无法找到输入和输出之间的相关性.

8  & (-8)  = 8
7  & (-7)  = 1
97 & (-97) = 1
Run Code Online (Sandbox Code Playgroud)

所以可能重要的是位操作?

0000 1000 & (1111 1000) = 0000 1000
0000 0111 & (1111 1001) = 0000 0001
0110 0001 & (1001 1111) = 0000 0001
Run Code Online (Sandbox Code Playgroud)

在上述每种情况下,高4位总是最终为0,但我找不到输入之间的相关性以及低4位最终的结果.

有任何想法吗?

解答: 找到最低设置位

Jar*_*uen 6

解释另一个答案,二进制补码等于一个数的补码加 1。让我们看看 8 的补码加 1 是如何进行的。

8 -> 00001000 (bin) -> 11110111 (oc) -> 11111000 (tc)
Run Code Online (Sandbox Code Playgroud)

在这里,注意添加的 1 如何通过一个的补码直到它到达第一个 0,翻转那个位和它右边的位。而且,还要注意,补码中第一个 0 的位置也是原始二进制表达式中第一个 1 的位置。

In 中x & (-x),第一个 1 in 左侧的位x将为 0,因为它们仍然从取补码中翻转过来。然后,第一个 1 右边的位也将是 0,因为它们是 0 in x(否则第一个 1 会更早)。

因此, 的输出x & (-x)将是对应于第一个 1 位置的 2 的幂x


Pac*_*ac0 0

根据定义,二进制补码等于二进制补码(所有位反转)加一。

如果你只计算数字&及其补数,它总是会给出0000 0000

理解该模式的关键在于:+ 1操作是否更改其他位或仅更改最后一位。也就是说,如果数字末尾有 1,并且在 +1 加法之后是否会传播任何提醒。