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位最终的结果.
有任何想法吗?
解答: 找到最低设置位
解释另一个答案,二进制补码等于一个数的补码加 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。
根据定义,二进制补码等于二进制补码(所有位反转)加一。
如果你只计算数字&及其补数,它总是会给出0000 0000。
理解该模式的关键在于:+ 1操作是否更改其他位或仅更改最后一位。也就是说,如果数字末尾有 1,并且在 +1 加法之后是否会传播任何提醒。