对不起,又一个K&R问题!练习2-9:在两个补码系统中,x &= (x - 1)删除x中最右边的1位。解释原因。
我解决了这个问题(我想是错误的),我决定删除超过最右边的1位。我知道,在两个补码中,负数是通过取补和加1来形成的,然后再加负数进行减法,然后丢弃高进位。
因此,让我们取x= 8,我将使用2个字节来表示简洁性:
X= 00001000
所以要做x-1,我们实际上是加-1?所以,1的补码是: 11111110,加上1,我们得到11111111。
那么我们有: 00001000 +11111111 = 00000111
这就是我们所期望的答案。接下来,我们将使用x的结果,并将其赋值为x: 00001000 &00000111 = 00000000
其中,我似乎犯了某种错误,因为超过正确的大部分被删除了。
发布于 2022-10-22 02:58:47
你做得很好。我认为你只是误解了“最右边的1位”的含义(你一直在说“最右边的部分”,从最初的提示符中省略了“1位”)。
00001000只有一个1位。操作结束后,1位就消失了;正如您所显示的,剩下的是00000000。它完全按照它在tin上说的做,找到最接近右手边的1并清除它(该1位右侧的所有0位保持不变,左边的所有位都保持不变,无论它们是0还是1)。如果您用00110000计算出相同的数学,您会发现结果是00100000,移除最右边的1-bit,将其翻转到0。0111变成0110,0110变成0100等等。
https://stackoverflow.com/questions/74160717
复制相似问题