今天下午上数字逻辑,老师在讲 数制
和 码制
,闲来无事,便开始思考以前一直忽略的 关于进制转换的原理
,细细思考之后,发现了一些好玩的东东,记下来记下来~
首先是 十进制整数部分转换成其他的进制
,方法大家都懂的:
不断除以基数取余数,直到商为零,从下到上读取余数
以前一直搞不懂为什么是从下到上,只知道书上怎么说就怎么用~ 经过思考了之后,我发现了原因是这样的:
之所以要从下到上数,是因为越往后该位所处的位权越高(因为被除了更多次了嘛),所以,该位是被除了多少次之后得到的就是该位的位权
这样的解释,应该是对的吧~
然后是小数部分,方法是这样的:
不断乘以基数取整数,从上到下读取整数,直到满足精度要求为止
这里有两个问题:为什么又变成了乘法和从上到下呢?
原因是这样的:
我们可以联系一下二进制转小数部分十进制的方法,是按照对应位大小乘以位权,而小数部分位权都是负数,也就是相当于除法,所以,作为逆运算,就应该是乘法。至于为什么是从上到下,我们看一下相应位的位权的绝对值就可以知道了。
最后的一个问题是关于补码的。去年学C语言的时候,在学这一部分的时候总是纳闷,为什么要取反再加一? ,现在想想,没错,这不是认为刻意的规定,而是必然!!!理由:
我们知道弄一个补码是为了解决数的正负。所以,我们就可以从这一个方面来理解了。任何一个负数,其实我们都可以看作是:** 0 减去该数的绝对值 !** 又因为数又分为奇数和偶数,我们分两方面来看:
1. 奇数
在二进制里面,奇数的最低位肯定是1,所以被 0 减去之后最低位肯定是1,然后,又因为 0 比该数的绝对值小,所以存在借位的情况,然后借位之后肯定是要还位的,所以被减数 0 就除了最低位之外都是 1 了,降下来的各位,已经很明显了,如果是 0 : 1 - 0 = 1;如果是 1:1 - 1 = 0。所以,奇数的补码是结果是这样的:最低位肯定是 1,然后其余位都取反。你再去对照我们求补码的方法就会发现结果都是一样的!
2. 偶数
有了上面奇数的例子,其实偶数就很好理解了,因为偶数就是在某一个奇数后面加上若干个 0 ,也就是说,偶数的最低位肯定是 0 。所以,我们就可以理解奇数的方法来理解:因为偶数就是在某个奇数后面加上若干个 0 ,所以,奇数提到的借位肯定不会发生在这些低位的 0 上(因为 0 - 0 = 0,根本就不用借位),因此,0 减去一个偶数的结果相当于某一个奇数取补码之后的结果再加上若干个0。那么,这个又跟补码的取法取反之后再加一有什么关系呢?我们来看:前面说过,偶数就是在某一个奇数后面加上若干个 0 ,所以它取反的结果我们分为两部分:奇数部分和0的部分。奇数部分取反肯定是 0 变 1 ,1 变 0 。在这里我们只需要注意该奇数的最低位是 1,所以取反后是 0 。然后是 0 的那一部分,取反肯定都变成了 1 。也就是说:上面取反的结果得到的是 奇数部分的最低位变成了 0,然后后面跟了若干个 1最后,再加 1 ,结果是上一步的若干个连续的 1 都变成了 0 ,然后奇数部分的最低位又变成了 1 ,其余位没有变化。那么这个时候你再对照一下我们上面用 0 减去该偶数的绝对值的做法,结果是一模一样的!!!
好了,说了这么多,究竟说明了什么呢?我觉得只说明了:补码是一种必然且自然的方法,取反再加一只是一种帮助记忆的方法罢了~
突然发现懂了一个东西以及能够将它正确地表达出来真的是两码事!感觉自己的表达能力还需要加强!!!希望这篇东东能够对大家有所帮助~
网友评论