以下内容是写在通过NandGame网站学习二进制运算的,但是没想到写了这么多,想着也可以单独发出来
写到这里突然想到最近在《编码:隐匿在计算机软硬件背后的语言》这本书看到二进制减法的运算,作者一开始不是直接讲减数要转换成补码再计算,而是讲了十进制减法为了不使用借位如何方便计算。比如61-19
,由于1不够减需要向6借以一位,那么有没有什么办法不借位计算呢?可以利用十进制的补数实现,可以通过99-19=80,61+80=141,141-100+1=42
,三个式子简化一下就是61+(99-19)-100+1
,这个式子和61-19
的结果是一样的,因为+100和-100其实就是0,这样子主要是不用借位,这样子计算对于人类来说太复杂了,毕竟简单的借位对人类来说很简单,为什么要提十进制的补数在减法的应用,因为二进制减法就是用了这个逻辑来实现的,减数为什么要取反?因为二进制的1111 1111-0001 0011=1110 1100
,这里用八个1去减就相当于十进制的99去减,这样子不用借位同时刚好是减数的反码,0001 0011的反码就是1110 1100,接下来是被减数加上减数的反码,0011 1101+1110 1100=1 0010 1001
,接着再加一,1 0010 1001+1=1 0010 1010
,前面加了1111 1111 和1,接下来要减掉,1 0010 1010-1 000 000 =0010 1010
,取得了二进制的补码。这样子在二进制的计算减法中也没用使用借位。文字和式子放在一起可能不好理解,单独把式子提取出来。
61(0011 1101)-19(0001 0011)补数的减法
十进制:
99-19=80
61+80=141
141-100+1=42
把上面三个合成一个式子:
61+(99-19)-100+1=42
二进制:
1111 1111-0001 0011=1110 1100(惊讶的发现0001 0011对每一位取反就是1110 1100)
0011 1101+1110 1100=1 0010 1001
1 0010 1001+1=1 0010 1010
1 0010 1010-1 000 000 =0010 1010
二进制的就不合成一个式子了,因为一合成那么多0和1更不好理解,整体来讲就是二进制的减法就是用了补数的逻辑实现的,这下就理解了二进制减数为什么要取反以及为什么要再加一,经过这两个操作被减数加减数得出的是原本两个数相减的结果。
标签:19,0011,0010,二进制,61,理解,减法 From: https://www.cnblogs.com/dx5800/p/18422456