其中' - '表示负x,'&'表示按位AND。
程序中的数字是8位2的补码,我似乎无法找到输入和输出之间的相关性。
8 & (-8) = 8
7 & (-7) = 1
97 & (-97) = 1
所以可能重要的是位操作?
0000 1000 & (1111 1000) = 0000 1000
0000 0111 & (1111 1001) = 0000 0001
0110 0001 & (1001 1111) = 0000 0001
在上述每种情况下,高4位总是最终为0,但我找不到输入之间的相关性以及低4位最终的结果。
有什么想法吗?
答案 0 :(得分:2)
为了解释另一个答案,二者的补码等于一个数的加1加1.让我们看一下如何将一个补码加到1中。
8 -> 00001000 (bin) -> 11110111 (oc) -> 11111000 (tc)
在这里,注意添加的1如何通过一个补码移动直到它到达第一个0,翻转该位和它右边的位。并且,还要注意,一个补码中第一个0的位置也是原始二进制表达式中第一个1的位置。
在x & (-x)
中,x
中第一个1左边的位将为0,因为它们仍然从取一个补码中翻转。然后,第一个1右边的位也将为0,因为它们在x
中为0(否则前一个1将更早)。
因此,x & (-x)
的输出将是2的幂,对应于x
中第一个1的位置。
答案 1 :(得分:0)
根据定义,二进制补码等于一的补码(所有反转的位)加一。
如果您只使用数字&
及其一个补码,则始终会0000 0000
。
理解模式的关键在于:如果+ 1
操作改变了其他位或仅改变了最后一位。也就是说,如果数字在结尾处有一个1,并且如果任何提醒将在+1添加后传播。