美文网首页想法哲思
计算机补码真的是天才般的创作

计算机补码真的是天才般的创作

作者: laughingDC_7dbc | 来源:发表于2019-07-30 09:14 被阅读0次

计算机用补码代替负,然后用加法代替减法的想法让人惊艳。惊为天人的人才会这么干,我心想。但仔细一想,你会发现,事情并没这么简单。

1,有限位2进制数的加法计算本来就是在求同余

这一点很显然。一个k位2进制数能表示的数字的个数是2^k。如果从0开始算,最大的整数就是2^k-1。这些数以及他们的加法都显然生活在mod 2^k 里,永远也不能超过他。

2,补码的计算方法其实就是减法。

补码并未规避减法的存在。实际上,计算补码就是一个减法的过程。只不过:

a-b \ (mod n) =a+(n-b) \ (modn)

为什么n-b的计算要比a-b好呢?因为n一定是2^k,这个数就是2进制表示下的一组本征解(1<<k)。n比起a来说要好表示的多。

其次,n-b这个减法也好算的多。实际上,我们会有类似这样的算法笔试题:

用bit operation计算n-b。

n-b的技巧无非是,首先注意到n只有最高位是1。把n的traliling 0 变成1, 用这些全部的1去减一个(位数比自己小的)数,得到的结果很简单:

b中的1被1减,就得到0;0被1减,还是1。不存在任何借位的问题。这就是为什么n-b好算了。

那么,如何把n的traliling 0 全部变成1呢?

就是n-1了。这是2进制中翻转trailing 0的最好的做法。当然此做法同时把最低位的1变成了0。如果你不想这么做的话,你可以再和n 做一个or运算即可。

所以,世界上最简单的减法就这样完成了:

n-1-b

为了正确计算n-b

注意到n-1-b+1=n-b

因此,我们计算n-b的过程就是,把b每一位翻转,剩余的高位全部补1,最后再加1。当然,为了区别他和普通的正数,最高位置1。

一个例外是,如果你这样计算0 的负数,你最高位自然就是1了。不过在mod n 的运算中,0既可以是0,又可以是n。所以这个特别的数就计作n的负数,-n了。

相关文章

  • 计算机补码真的是天才般的创作

    计算机用补码代替负,然后用加法代替减法的想法让人惊艳。惊为天人的人才会这么干,我心想。但仔细一想,你会发现,事情并...

  • Python位运算

    计算机中有原码,反码,补码的概念。计算机只能储存数字数据,而且是数字的补码,运算时也通过补码,因为计算机中只有加法...

  • 计算机中二进制补码的运算原理

    在计算机中负数以补码形式表示,计算负数补码的方法是符号位不变,其余位按位取反再加1。简言之,补码是计算机中用来表示...

  • 位运算

    1.原码、反码、 补码正数的原码、反码、 补码都一样 正数以原码存储在计算机负数 以补码存储在计算机 例...

  • Java中高位转低位溢出的计算过程

    结果是: 计算机中是以补码进行计算 正数的反码补码都是原码,如:10原码: 1010反码: 1010补码:1010...

  • 原码、反码、补码

    数值在计算机中是以补码的方式存储的,在探求为何计算机要使用补码之前, 让我们先了解原码, 反码和补码的概念。 对于...

  • 原码、反码、补码

    数值在计算机中是以补码的方式存储的,在探求为何计算机要使用补码之前, 让我们先了解原码, 反码和补码的概念。 对于...

  • 原码,反码,补码

    数值在计算机中是以补码的方式存储的,在探求为何计算机要使用补码之前, 让我们先了解原码, 反码和补码的概念。 对于...

  • 原码,反码,补码

    数值在计算机中是以补码的方式存储的,在探求为何计算机要使用补码之前, 让我们先了解原码, 反码和补码的概念。 对于...

  • int数字的表示

    在计算机中int型数字使用补码的形式在存储。首先说明补码的计算方式。正数和零的补码就是他们本身。负数的补码是符号位...

网友评论

    本文标题:计算机补码真的是天才般的创作

    本文链接:https://www.haomeiwen.com/subject/trxgrctx.html