据我所知,这两个补充算法是:
1.以二进制表示小数。
2.反转所有位 3.将1添加到最后一位。
对于代号为3
的数字0000000000000011
,两个补码的结果为1111111111111101
,即-3
。
到现在为止还挺好。
但对于其代表为2
的数字0000000000000010
,两个补码的结果将为1111111111111101
,而不是2而是-3。
我做错了什么?
答案 0 :(得分:3)
对于你的代码,你可能需要做2的补充:我只是想把它扔出去(更快获得负二进制的方式):
2的补码对于找到二进制的值非常有用,但是我想到了解决这个问题的更简洁的方法(从未见过其他人发布过它):
取二进制,例如:1101 [假设空格“1”是符号]等于 -3 。
使用2的补码我们会这样做...翻转1101到0010 ...添加0001 + 0010 ===>给我们0011. 0011 in positive binary = 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 < sup> 0 * 1)= -3
希望这可能有所帮助!答案 1 :(得分: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
答案 2 :(得分:0)
我做错了什么?
为第二个例子(或误解)跳过第3步。
1111111111111101
是2
的补码(即步骤1和2的结果);你需要添加1 - 不是最后一位(如二进制数字),而是最后一个结果(如第2步所示)。