1

据我所知,二进制补码算法是:

1.用二进制表示十进制。
2.反转所有位。
3.最后一位加1。

对于数字3,它的表示是:0000000000000011二进制补码的结果将1111111111111101-3
到目前为止,一切都很好。但是对于2它的表示是0000000000000010二进制补码结果的数字将是1111111111111101,它不是 2 而是 -3。
我究竟做错了什么?

4

3 回答 3

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

希望这可能会有所帮助!

于 2013-06-22T19:53:14.473 回答
1
0...0010 // 2
1...1101 // Flip the bits
1...1110 // Add one

它也适用于负面:

1...1110 // -2
0...0001 // Flip the bits
0...0010 // Add one
于 2012-12-06T01:25:49.667 回答
0

我究竟做错了什么?

跳过第二个示例的第 3 步(或误解它)。

11111111111111012(即第 1 步和第 2 步的结果)的补码;您需要添加 1 - 不是添加到最后一位(如二进制数字),而是添加到最后一个结果(如从第 2 步得到的结果)。

于 2012-12-06T01:20:27.210 回答