据我所知,二进制补码算法是:
1.用二进制表示十进制。
2.反转所有位。
3.最后一位加1。
对于数字3
,它的表示是:0000000000000011
二进制补码的结果将1111111111111101
是-3
。
到目前为止,一切都很好。但是对于2
它的表示是0000000000000010
二进制补码结果的数字将是1111111111111101
,它不是 2 而是 -3。
我究竟做错了什么?
据我所知,二进制补码算法是:
1.用二进制表示十进制。
2.反转所有位。
3.最后一位加1。
对于数字3
,它的表示是:0000000000000011
二进制补码的结果将1111111111111101
是-3
。
到目前为止,一切都很好。但是对于2
它的表示是0000000000000010
二进制补码结果的数字将是1111111111111101
,它不是 2 而是 -3。
我究竟做错了什么?
对于您的代码,您可能需要进行 2 的补码:我只是想把它扔掉(获得负二进制的更快方法):
2 的补码对于查找二进制的值非常有用,但是我想到了一种更简洁的方法来解决这样的问题(从未见过其他人发布过它):
以二进制为例: 1101 [假设空格“1”是符号]等于-3。
使用 2 的补码我们会这样做...将 1101 翻转到 0010...添加 0001 + 0010 ===> 给我们 0011. 0011 正二进制 = 3。因此 1101 = -3!
我意识到:
而不是所有的翻转和添加,你可以只做解决正二进制的基本方法(比如说 0101)是 (2 3 * 0) + (2 2 * 1) + (2 1 * 0) + (2 0 * 1) = 5。
用否定做完全相同的概念!(稍微扭曲)
以 1101 为例:
对于第一个数字而不是 2 3 * 1 = 8,请执行 -(2 3 * 1) = -8。
然后像往常一样继续,做-8 + (2 2 * 1) + (2 1 * 0) + (2 0 * 1) = -3
希望这可能会有所帮助!
0...0010 // 2
1...1101 // Flip the bits
1...1110 // Add one
它也适用于负面:
1...1110 // -2
0...0001 // Flip the bits
0...0010 // Add one
我究竟做错了什么?
跳过第二个示例的第 3 步(或误解它)。
1111111111111101
是2
(即第 1 步和第 2 步的结果)的补码;您需要添加 1 - 不是添加到最后一位(如二进制数字),而是添加到最后一个结果(如从第 2 步得到的结果)。