当前位置:编程学习 > C#/ASP.NET >>

我自己写的一篇关于进制数转换的原创,各位帮忙看看并指教下

(原创)浅谈进制数之间转换的原理
凡是将要学习或者学习过计算机编程的人,一定会接触到二进制、八进制、十进制、十六进制的概念以及它们之间的相互转换。虽然每个人都会如何相互转换它们,但对于其转换的数学原理和论证或许很少有人深思,因此绝大多数人基本都只懂得如何进行各进制数之间的相互转换却不理解其转换的本质(这是通过百度,谷歌搜索得到的结论——凡是关于提问进数制转换的原理,其答案都被简单的用进数制转换方法来回答,根本就是驴唇不对马嘴)。本人是计算机编程初学者,本着刨根问底的学习态度浅尝探究了其数学原理,想与各位计算机爱好者共同分享下,如有不对的地方也希望指教及纠正。
首先,我们应理解什么是数,什么是数字,什么是进制,什么是进制数?
数,是一种客观存在的事物的数量。
数字,是数的延伸,是为了如何表示客观存在的事物的数量而用的一种符号。比如,桌子上有一排咖啡杯,我们用中文表示就是一、二、三、四、五……;用英语表示就是one、two、three、four、five……;用阿拉伯数字表示就是1、2、3、4、5……,这些都是数字,甚至一“横”一“划”也可以表示数字。
我们在使用数字时为了使用方便产生了进制这个概念。什么是进制?粗俗点讲就是以某个数字(就是符号)为一个量纲或者数量的一个分界线。
进制数就是数字和进制相结合来表示数,也就是用各个符号按进制所规定的来排列组合表示客观存在的事物的数量——数。
我们以二进制举例来说清楚上面这些概念,听说古埃及人就是用二进制的,假如在没有产生进制这个概念时——当然没有进制这个概念连二进制这个概念也就不存在了,所有的古埃及人在表示数(客观存在的事物的数量)时,就拿一根树枝在沙子上划一“竖”表示一个事物,划两“竖”表示两个事物,划三“竖”表示三个事物,以此类推……后来有个智商比普通人高的古埃及人有次闲来无事在统计家里墙上有多少块砖头时(就像阿基米德没事就跳入澡盆洗澡,哥白尼喜欢一天到晚看着太阳升起落下一样“无聊”)用树枝在地上划啊划的,划到后面他心烦了,因为太多的一“竖”了,统计起来太麻烦。于是他想了一个划时代的方法,他以2为统计的分界线(那个时代没有零这个概念,我们假设有零的概念吧),并用一“竖”表示“零”(我们用中文表示数,即客观存在的事物的数量),一“横”表示“一”:每次在任意一个数位上统计超过“—”时,也就是统计到“二”时,就擦掉一“横”,划上一“竖”,并在一“竖”前添加一“横”,因此具体如下表所示
零 一 二 三 四 五 六 七 八 九
| — —| —— —|| —|— ——| ——— —||| —||—
这个例子看上去也很难统计与理解它表示的数(这也是为什么我们日常使用十进制了,发明用十进制计数的人绝对是数学史上,毫不夸张的说也是整个世界和历史上最伟大的人,没有之一),我们不管这些,重要的是这个例子告诉我们数字只是数的符号,而本质上的数可以用任何符号排列表示。
接下来我们回到现代的数字系统上来,也就是用阿拉伯字母表示数字符号。在现在数字系统上我们采用的计数方法也是进制方法,专业点说,叫做进位计数制。
规定某个数制(如二进制,十进制等)采用R个基本符号(各个基本符号各不相同),就说这个数制为R进制。R叫做这个R进制的基数,各个数字的位置上的固定值叫做权,权等于以R为底的幂,任何一个R进制数按权展开相加之和(包括十进制自己)与十进制按权展开相加之和相等。至于为什么相等稍后解释。
上述概念如下所示:
二进制:R=2;基本符号——0、1
八进制:R=8;基本符号——0、1、2、3、4、5、6、7
十进制:R=10;基本符号——0、1、2、3、4、5、6、7
十六进制:R=16;基本符号——0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F
其中A、B、C、D、E、F分别代表10、11、12、13、14、15
在十六进制中为什么不直接用10、11、12、13、14、15表示呢?这是为了不与0、1、2、3、4、5这些数搞混,比如14H(H表示这个进制数是十六进制的)到底是代表十六进制中的14呢,还是十六进制中的1和4呢?
接下来看下如何按权展开R进制数,以二进制和十进制举例:
二进制数:1010B(B表示这个进制数是二进制的)
1010B=1×2^3+0×2^2+1×2^1+0×2^0
十进制数:10
10=1×10^1+0×10^0
以上的二进制数和十进制数是相等的,但为什么一个二进制数按权展开相加就等于一个十进制数呢,或者说为什么任意一个R进制数按权展开相加就是一个十进制数呢?
这里我们就又要回到那个古埃及的例子上了,我们从古埃及的例子上知道,数是一个事物客观存在的数量,我们可以用任意符号排列去表示它。所以对于一个固定的数,不管用二进制数表示还是用十进制数表示,都只是这个数的一种表现形式。的确,这个概念有点搞,下面我再通过一个例子更加清楚的阐述这个问题。
桌子上有二十个咖啡杯,这里需谨记,这里的二十并不是说就是一个十进制数,它只是客观存在的一个数量,为了不搞糊涂,对于数我还是用中文表示,数字用阿拉伯数字表示:
现在我用二进制和十进制开始从零个咖啡杯数到二十个咖啡杯(再次记住咖啡杯的数量是不以数字表示而客观存在的)。
客观存在的咖啡杯数量 二进制数 十进制数
零 0 0
一 1 1
二 10 2
三 11 3
四 100 4
五 101 5
六 110 6
七 111 7
八 1000 8
九 1001 9
十 1010 10
十一 1011 11
十二 1100 12
十三 1101 13
十四 1110 14
十五 1111 15
十六 10000 16
十七 10001 17
十八 10010 18
十九 10011 19
二十 10100 20
我们取其中的十五个杯子,如下表示:
十五 1111 15
可以得出:
十五=1111=1×2^3+1×2^2+1×2^1+1×2^0
十五=15=1×10^1+5×10^0
由于我们通常把客观事物的数量用十进制数表示,并且用十进制数的读法来读取数,因此任意进制数按权展开相加好像就是十进制数了,其实表示的还是客观事物的数量。如果我们通常把客观事物的数量用八进制表示,即十五=一七,则:
一七=1111=1×2^3+1×2^2+1×2^1+1×2^0
一七=15=1×10^1+5×10^0
一七=017=1×8^1+7×8^0
这样十进制数如同上面例子中二进制数的地位了,二八进制就是上面例子中十进制数的地位了。再读读会怎么样,有点读十进制的感觉了吧。可是我们还是发现了点问题,上面三个进制数按权展开后相加还是得到1111=15、15=15、017=15,似乎如果用一七=十五表示,应该按权展开相加后得到的是一七,但这正是为什么十进制系统的完美了,十进制系统正好和按权展开相加后的值牢牢吻合了。
我们知道了如何任意进制数转换为十进制数,那么如何从十进制数转换成任意进制数呢? 
以十进制整数转换成二进制整数为例(十进制实数转换成二进制实数,也就是带小数点的进制数这里不论证,网上有),方法和论证如下
由于abcdB =15
十进制数和二进制数按权展开,记“/”为整除符号
a×2^3+b×2^2+c×2^1+d×2^0=1×10^1+5×10^0
2(a×2^2+b×2^1+c×2^0)+d×2^0=1×10^1+5×10^0
a×2^2+b×2^1+c×2^0=(1×10^1+5×10^0)/2,并余d=1
2(a×2^1+b×2^0)+c×2^0=((1×10^1+5×10^0)/2)
a×2^1+b×2^0=((1×10^1+5×10^0)/2)/2,并余c=1
2(a×2^0)+b×2^0=((1×10^1+5×10^0)/2
a×2^0=(((1×10^1+5×10^0)/2)/2)/2,并余b=1
0=((((1×10^1+5×10^0)/2)/2)/2)/2,并余a=1
可以看到当十进制数不断地除基数R,直到除数为0,各余数从下到上拼接就是二进制数了。
最后我们要探讨下二进制整数和八进制整数、十六进制整数的相互转换


--------------------编程问答-------------------- 好 --------------------编程问答-------------------- 可是我们还是发现了点问题,上面三个进制数按权展开后相加还是得到1111=15、15=15、017=15,似乎如果用一七=十五表示,应该按权展开相加后得到的是一七,但这正是为什么十进制系统的完美了,十进制系统正好和按权展开相加后的值牢牢吻合了。

这段话有误,因为没办法重新编辑,在这里特地加上声明并修改
按权展开后相加为什么总是的到十进制数呢,这个是我们在按权展开相加过程中被迷惑了,因为在按权展开相加中我们采用的十进制系统,因此得到的也是十进制数。假如我们在按权展开过程中使用八进制系统,看看会得到什么?
一七=1111=1×2^3+1×2^2+1×2^1+1×2^0=10+4+2+1=17
一七=15=1×10^1+5×10^0=10+5=17
一七=017=1×8^1+7×8^0=10+7=17
17不能读作一十七,要读作一七
是不是和在十进制系统中一样了呢
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,