NOIP初赛篇——06数制转换

进位计数制的基本概念

​ 将数字符号按顺序排列成数位,并遵照某种由低到高的进位方式计数表示数值的方法,称作为计数制。

十进制

十进制计数制由0、1、2、3、4、5、6、7、8、9共10个数字符号组成。相同数字符号在不同的位数上表示不同的数值,每个数位计满十就向高位进一,即“逢十进一”。

八进制

八进制计数制由0、1、2、3、4、5、6、7共8个数字符号组成。相同数字符号在不同的数位上表示不同的数值,每个数位计满八位就像高位进一,即“逢八进一”。

二进制

二进制计数制由0和1共两个数字符号组成。相同数字符号在不同的数位上表示不同的数值,每个数位计满二就向高位进一,即“逢二进一”。

其他进制

​ 在日常生活和工作中还会使用其他进制数。如:十二进制数、十六进制数、百进制数和千进制数等。无论哪种进制数,表示的方法都是类似的。如:十六进制数由0、1、2、3、4、5、6、7、8、9、A、B、C、D、E和F共16个符号组成,“逢十六进一”。不同的是,用A、B、C、D、E和F分别表示10、11、12、13、14和15六个数字符号。

基数与权

​ 某进制计数制允许选用的基本数字符号的个数称为计数。一般而言,J进制数的计数为J,可供选用的基本数字符号有J个,分别是0到J-1,每个数位计满J就向高位进一,即“逢J进一”。

​ 某进制计数制中各位数字符号所表示的数值表示该数字符号值乘以一个与数字符号所处位置有关的常数,该常数称为“位权”(简称“权”)。位权的大小是以计数为底、数字符号所处的位置的序号为指数的整数次幂。

​ 十进制数允许使用是个基本数字符号,所以基数为10,每位数字符号代表的位数的大小是以10为底,数字符号所处位置的序号为指数的整数次幂。

​ 十进制的百位、十位、个位和十分位的权分别为102,101,100,10-1。故(555.5)10 可表示成(555.5)10=5 * 10^2+5 * 10^1+5 * 10^0+5 * 10-1。J进制数相邻两位数相差J倍,若小数点向左移n位,则整个数值就缩小Jn。反之,小数点向右移n位,数值就放大J^n。

数制之间的转换

​ 计算机内部使用的数字符号只有“0”和“1”两个。也就是说,计算机内部使用的是二进制数,所有的数值数据和非数值数据,都是由“0”和“1”这两个数字符号加以组合而成的,我们称之为“二进制代码”。

​ 计算机只用二进制的两个数码“0”和“1”来实现算数和逻辑运算,而人们仍然用十进制的形式向计算机中输入原始数据,并让计算机也用十进制形式显示和打印运算结果。所以,必须有一种自动转换方法,即让数据输入计算机后,将十进制转换成对应的二进制数,并在处理完毕后,再自动将二进制结果转换位十进制数。

​ 为了表达方便起见,常在数字后加一缩写字母后缀作为不同进制的标识。各种进制数的后缀字母分别为:

​ B:二进制数 O:八进制数

​ D:十进制数 H:十六进制数

​ 对于十进制数,通常不加后缀,也即十进制数后的字母D可省略。

十进制转二进制

​ 整数转二进制整数转二进制是最常见的。核心在于除2取余,倒序排列,高位补零。 不断地将数字除以2,将余数写一边,直到商为0时停止。下方的为二进制的高位,由高位到低位倒序排列余数,高位不够用0来代替。

负整数转二进制

​ 先是将对应的正整数转换成二进制后,对二进制取反然后再加1。以-10为例。10的二进制表达是(00001010)B,由于高位都是0,所以可以省略,写成(1010)B ,(用B来表示表达的是二进制)。

  1. 先取反。取反的意思就是1变成0,0变成1。(00001010)B=>(11110101)B

  2. 加上1。由于是二进制,所以我们逢二进一。(11110101)B =>(11110110)B。由于小数的高位都是1,所以我们也可以将高位省去,只保留(0110)B。不过注意和正整数进行区别。

小数转二进制

将小数部分乘以2,取整数(这个整数不是0就是1),当乘以二后小数部分结果为0或者位数够了,这些整数就是二进制。

以0.125为例

0.125 * 2 =0.25 整数部分为 0

0.25 * 2 = 0.5 整数部分为 0

0.5 * 2 = 1.0 整数部分为1,小数部分为0,停止。

二进制就为0.001

如果是带整数部分的小数进行进制转换,那么分开来处理,先将整数部分,转换成二进制,再将小数部分,转为二进制。

注意 小数进行二进制转换是存在无法除尽的情况的,这是正常的。根据题意保留足够的位数即可。

二进制转十进制

使用按权相加法。

高位为0

首先第一步将位数补齐,如果高位是0则是一个正数。将其分离位数,将分离出来的位数按从低位到高位的顺序,依次和2的冥相乘累加。以(1010)B为例。

分离位数: 1 0 1 0 => 相乘累加

[0 imes2^0+1 imes2^1+0 imes2^2+1 imes2^3=10 ]

高位为1

如果高位为1,则说明是一个负数,那就先减1,再进行取反,在进行转换。以(11110110)B为例:

减一:(11110101)B => 取反: (00001010)B=>按权相加:

[0 imes 2^0+1 imes2^1+0 imes2^2+1 imes2^3=10 ]

小数形式

整数部分和小数部分分开计算。整数部分参考上面。小数部分则是相反。以(0.001)B为例。按权相加:

[0 imes2^{-1}+0 imes2^{-2}+1 imes2^{-3}=0.125 ]

其他进制转换

整体上的方法和十进制与二进制的转换方法类似。转换成x进制的话使用除x取余,倒序排列,高位补零。二进制转换成其他进制还是采用按权相加的方法。

八进制与十六进制

八进制是逢八进一。十进制转八进制的话,过程就是不断地将数字除以8,将余数写一边,直到商为0时停止。下方的为二进制的高位,由高位到低位倒序排列余数,高位不够用0来代替。以十进制10转换为八进制例。

十六进制也是类似,需要注意的点是,十六进制的10 ~ 15是使用A ~ F来表示的。

不积硅步,无以至千里。
原文地址:https://www.cnblogs.com/wyloving/p/14017987.html