关于不同进制数之间转换的数学推导

涉及范围:正整数范围内二进制(Binary),八进制(Octonary),十进制(Decimal),十六进制(hexadecimal)之间的转换

数的进制有多种,比如两双袜子为一双就采用二进制,平常的一周七天就采用七进制,每小时有六十分钟就采用六十进制。在计算机科学中我们经常用的有二进制,八进制,十进制,十六进制。计算机只能识别0和1组成的数字,但由于当一个数字比较大的时候,二进制的长度将变得非常长,对于人来说可读性非常差,而进制越大,那么数据显示的长度便越短,于是便产生了更大的进制。除了十进制外,至于为什么常用的是二进制,八进制,十六进制,一个合理的解释应该是它们是二的幂次。然而如果你非要问我,如果它们是二的幂次,那么为什么不常用用四进制,三十二进制,那么我只能无言以对了。好了,下面说说进制之间的转换方法。

首先我们需要了解一些知识:

关键词:基(radix),数位对应的数(number),数位(digit),权重(weight),记法

(1)  基:对某一个进制数而言,它的基(radix)就是指该进制数的进制大小,比如我们说一个数为R进制,那么这个数的基就为R。为便于书写,我们记作R。

(2)数位:数位的含义是:不同的计数单位,按照一定的顺序排列(在这儿我们定义为从右至左),它们所占的位置叫做数位。同时,我们从零开始,从右至左依次为这些位置编号。假如这个数有M位数,那么最左边的一个数的数位位置编号即为M-1,简要记作数位D=M-1。那么我们可以很快的推算出,一个数中第n个数(注意,我们默认从右至左,从零开始)的数位为n-1. 为便于书写,我们记作D。

(3)数位对应的数:由字面意思可以知道,数位对应的数即为一个数中数位所对应的数,比如十进制数12345,其数位2对应的数为3. 为便于书写,我们将一个数中的某个数字记作N,将该数的数位记作ND

(4)权重:通俗的说,就是某个数中的某个数字N所占的比重,其大小为N 与R的ND幂之乘积,我们记为W。如下图:

(5)记法:在这里在数字后面附上用小括号括起进制英文的大写字母,表示该数的进制,通常十进制后面可以省略。如果已经明确的说明了某个数为几进制,在不引起混淆的情况下,那么后面的附加字母也可以省略。

比如数101或者101(D)表示十进制数101,101(B)指二进制数101, 101(O)表示八进制数101,  101(H)表示十六进制数101. 另外,比如我们说二进制数101,我们便不必写为101(B)。

现在我们开始计算:

二进制,八进制,十进制-------->十进制

记R进制数P由m个数字组成(不能以0开头,但可以以0结尾),P转换为十进制数P的公式(这博客园没有办法编辑公式,只好把word截图了):

其中表示数位为i的数字的权重。也就是说,某个进制的数字转换为十进制的算法即是各个数位对应的数的权重之和。

下面举个例子,将101010(B)转换为十进制数P(D)。显然这个数有六位数字组成,即m=6,所以为六个权重之和。依据上面的公式有,

P(D)=0*2­0+1*21+0*22+1*23+0*24+1*25 =42

即有:42(D)=101010(B)

十六进制数2AF5换算成10进制:                      P(D)= 5 * 160   + F * 161 + A * 162 + 2 * 163 = 10997

即有:10997(D)=2AF5(H)(注:在上面的计算中,A表示10,而F表示15)

十进制-------->二进制,八进制,十进制

为了便于表达,这里采用C语言中的两个符号%与/.其中%表示求余,反斜线/表示求商,比如15/7=2 15%7=1

记十进制数P,将十进制数P转换为R进制数T,转换后R进制数的第i数位对应的数字为Ki,Ki求法为:

Ki=(P/Rn)%R 【P≥Rn

则有:T(R)= Ki Ki-1Ki-2…….. K1 K0 (只是简单的合并,并不是连乘)

下面举个例子,将40转换为十六进制数:K0=(40/160)%16=8    K1 =(40/161)%5=2     所以T(16)= K1 K0=28 即有:28(16)=40(D)

好了到现在为止,已经完成了十进制《======》二进制,八进制,十进制的正整数之间进制的互转(其实对于正整数之间进制的互转,上面的公式可以推广)。

进制的转换算法还存在于负数以及小数之间,隔日再述。

2013.9.18于大学逃课其间所创作……

-----------KillerLegend

========================================================================================

如有转载,请注明出处,如有疑问,请留言,如想进一步探讨,欢迎发消息至我的邮箱:chinamyth1@gmail.com

欢迎访问我的博客:http://www.cnblogs.com/killerlegend

========================================================================================


672
-->

关于不同进制数之间转换的数学推导【Written By KillerLegend】的更多相关文章

  1. js各种进制数之间的转换

    计算机中常用的进制数有二进制.八进制.十进制.十六进制 一.十进制 to 其他 var x = 10; // 或定义其他值均可 x.toString(n); // n 代表要转换到的进制,比如n可以为 ...

  2. HDOJ/HDU 2352 Verdis Quo(罗马数字与10进制数的转换)

    Problem Description The Romans used letters from their Latin alphabet to represent each of the seven ...

  3. 【题解】洛谷P1066 [NOIP2006TG] 2^k进制数(复杂高精+组合推导)

    洛谷P1066:https://www.luogu.org/problemnew/show/P1066 思路 挺难的一道题 也很复杂 满足题目要求的种数是两类组合数之和 r的最多位数m为 w/k(当w ...

  4. (任意进制转换)将 r 进制数转成 k 进制数

    我们知道任意进制转换为十进制,都是乘以基数的多少次方,然后相加: 十进制转换为任意进制,都是除以基数,然后倒着取余数: 所以这里是用十进制数中转,实现任意进制数的转换 #include<iost ...

  5. 编程实现将一个N进制数转换成M进制数

    问题:编程实现将一个N进制数转换成M进制数.(c/c++.Java.Javascript.C#.Python) 1.Python 手写算法版 def conversion_num(num, src, ...

  6. 汇编:1位16进制数到ASCII码转换

    ;============================ ;1位16进制数到ASCII码转换 ; { X+30H (0≤X≤9) ;Y= { ; { X+37H (0AH≤X≤0FH) DATAS ...

  7. 常用进制的转换、进制数的and与or或xor异或运算

    [十进制转换成其他进制]例:将25转换为二进制数 解: 25÷2=12 余数1  12÷2=6   余数0  6÷2=3     余数0  3÷2=1     余数1  1÷2=0     余数1 所 ...

  8. C++中,将单精度浮点数转换成2进制数

    在C++里,实数(float)是用四个字节即三十二位二进制位来存储的.其中有1位符号位,8位指数位和23位有效数字位.实际上有效数字位是24位,因为第一位有效数字总是"1",不必存 ...

  9. C# 2进制、8进制、10进制、16进制...各种进制间的转换(三) 数值运算和位运算

    一.数值运算 各进制的数值计算很简单,把各进制数转换成 十进制数进行计算,然后再转换成原类型即可. 举例 :二进制之间的加法 /// <summary> /// 二进制之间的加法 /// ...

随机推荐

  1. 【Android Api 翻译3】android api 完整翻译之Application Fundamentals (学习android必须知道的)

    Android应用程序是用Java编程语言编写的.Android SDK工具把应用程序的代码.数据和资源文件一起编译到一个Android程序包中(这个程序包是以.apk为后缀的归档文件),一个Andr ...

  2. 【开源项目3】Android快速开源框架--afinal

    Afinal简介 Afinal 是一个android的sqlite orm 和 ioc 框架.同时封装了android中的http框架,使其更加简单易用: 使用finalBitmap,无需考虑bitm ...

  3. Java各种类型占用的字节数

    Java 占用字节数 转自:http://www.blogjava.net/stevenjohn/archive/2013/10/18/405416.html 数据类型 大小(二进制位数) 范围 默认 ...

  4. Linux与Windows文件传输实现

    Linux与Windows文件传输实现 一.概述 在学习Linux服务器的时候,我们有时需要与Windows下的文件进行交互传输,这个时候我们需要如何实现呢?今天是我第一次在博客园上写文章,此时正值学 ...

  5. linux yum install resource - epel

    首先现在如下rpm包,然后安装对应的rpm包centos5 32位epel源下载地址: www.lishiming.net/data/attachment/forum/epel-release-5-4 ...

  6. Event Handling in Spring

    Spring内置的event有 1.ContextRefreshedEvent This event is published when the ApplicationContext is eithe ...

  7. xcode报错 has been modified since the precompiled header was built

    删除/Users/username/Library/Developer/Xcode/DerivedData/ModuleCache 下的所有文件

  8. Mac下kernel_task占用大量CPU怎么办?

    我们都知道要想让电脑运行的快速,那么就要尽量的保持内存和CPU的充足.不过一些MAC用户发现MAC系统中的Kernel_task会占用大量的CPU,导致电脑发热变卡.这个问题该怎么解决呢? 具体操作步 ...

  9. Struts2_使用 Filter 作为控制器的 MVC 应用

  10. MySQL之学生名次问题

    --对输入的数据进行约束create table t(studentID char(10), [name] varchar(8), startDate char(10) Check (isdate(s ...