二进制数的进制加法,本质上是算方把人类熟悉的十进制运算搬进一个只有0和1的世界。规则简单到令人惊讶:0+0=0,进制0+1=1,算方1+1=0(进位1)。进制但别小看这三条规则,算方它们构成了整个数字帝国的进制基础。
我小时候第一次看计算机原理图,算方觉得那满屏的进制0和1像某种密码。后来自己动手算了一笔账,算方才明白这玩意儿和小学学的进制竖式加法没本质区别——只是逢二进一,而不是算方逢十进一。比如十进制的进制5加3,写成二进制就是算方101加011。从最右边开始:1加1等于0,进制记下0并向前进一位;中间位0加1再加进位1,又等于0,再进位;最左边1加0加进位1,等于10,记下0,最前面落个1。结果是1000,也就是十进制的8。整个过程就像多米诺骨牌,进位一旦触发,就沿着位一路推过去。
减法呢?更狡猾。计算机里没有真正的减法器,它把减法变成加法——用补码。补码的概念初看很绕,但用时钟来类比就通了:在12小时制的钟表上,9点往前拨4小时是5点,往后拨8小时也是5点。这里-4等价于+8,因为12是模。二进制补码就是把这种“绕圈”思想数字化。8位二进制能表示256个数,减一个数就等于加上它的补码,然后自动溢出丢掉最高位的进位。比如7减3,7的二进制00000111,3的补码是11111101,两者相加得100000100,丢掉最前面的1,剩下00000100,正好是4。这种设计让电路只用加法器就能处理所有算术,省了大量晶体管。
乘除法才是真正考验耐心的部分。二进制乘法比十进制还笨——它不需要九九乘法表,因为每一位乘数只有0或1两种情况。1乘以任何数得原数,0乘以任何数得0。于是乘法退化成一系列移位和加法。算11乘以13,二进制1011乘以1101,把1101分别乘以1011的每一位:第一位1得1101,第二位1得11010(左移一位),第三位0得0,第四位1得1101000(左移三位)。把四个结果加起来,得到10001111,即143。整个过程像在摆积木,但积木的摆放规则极其机械。
除法更粗暴,直接用长除法,但每一步试商只有两个选择:够减就商1,不够减就商0。没有“试商几”的纠结。比如1001除以11,第一位商0,第二位商1,余数100,再补一位,商1,余数1。最终商11余1。这种机械性让硬件设计者狂喜——没有复杂的判断分支,只有移位、比较和减法。
有个细节我特别想提:溢出。8位二进制最多存255,如果算256,结果变成0。这不是bug,而是特性。很多初学编程的人被这个坑过——比如在单片机里累加计数,加到255后突然跳回0,导致逻辑错乱。但反过来,正是这种溢出机制让模运算变得极其高效,比如哈希算法、CRC校验,都靠它省时间。
说到底,二进制的计算方法没有高深理论,它就是把所有数学问题降维成“移位+加减”。这种简单换来了极高的可靠性——电路只需要区分高低电平,不需要精确测量电压。你让十进制的电子计算器去识别0到9十个电压等级,噪声一干扰就出错,但二进制只需要判断“大于阈值”或“小于阈值”。代价是位长变长,10在二进制里要写1010,100要写1100100。但硅晶体管的成本低到可以忽略,多几位就多几位,换来的是抗干扰能力和制造良率的大幅提升。这笔账,算得过来。
顶: 91踩: 577






评论专区