【问题标题】:two's complement二进制补码
【发布时间】:2012-11-23 23:59:27
【问题描述】:

据我所知,补码算法是:

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

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

【问题讨论】:

    标签: binary int representation twos-complement


    【解决方案1】:

    对于您的代码,您可能需要进行 2 的补码:我只是想把它扔出去(一种 更快 获得负二进制的方法):

    2 的补码对于查找二进制的值非常有用,但是我想到了一种更简洁的方法来解决此类问题(从未见过其他人发表过):

    取一个二进制,例如:1101 [假设空格“1”是符号]等于-3

    使用 2 的补码我们会这样做...将 1101 翻转到 0010...添加 0001 + 0010 ===> 给我们 0011。0011 正二进制 = 3。因此 1101 = -3

    我意识到:

    而不是所有的翻转和添加,你可以做一个基本的方法来解决一个正二进制(比如说 0101)是 (23 * 0) + (22 * 1) + (21 * 0) + (20 * 1) = 5。

    用否定做完全相同的概念!(稍微扭曲)

    以1101为例:

    对于第一个数字,而不是 23 * 1 = 8 ,执行 -(23 * 1) = - 8.

    然后像往常一样继续,做 -8 + (22 * 1) + (21 * 0) + (20 * 1) = -3

    希望能有所帮助!

    【讨论】:

      【解决方案2】:
      0...0010 // 2
      1...1101 // Flip the bits
      1...1110 // Add one
      

      它也适用于负面:

      1...1110 // -2
      0...0001 // Flip the bits
      0...0010 // Add one
      

      【讨论】:

      • 谢谢,我加1时出错了。
      • @pst 我不知道你在说什么
      • 我还有一个小问题。我的否定一个数字的算法和从右到左扫描数字并在第一次出现 1 后补全所有位的算法有什么区别?
      • @Lior 我不确定它是否有效,但您可以用笔和纸试一试。即使是这样,我也认为所需的电路远不止是简单的位反转和相加,这非常快。
      • 好的,谢谢 :) 如果您想了解更多关于“替代转换过程”的信息(如维基百科中所写):en.wikipedia.org/wiki/Two%27s_complement
      【解决方案3】:

      我做错了什么?

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

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

      【讨论】:

      • 谢谢,我加1时出错了。
      猜你喜欢
      • 1970-01-01
      • 2015-04-12
      • 1970-01-01
      • 1970-01-01
      • 2014-09-20
      • 1970-01-01
      • 1970-01-01
      • 2011-04-18
      • 2015-04-07
      相关资源
      最近更新 更多