咱们都知道十进制是“逢10进1 ”,同理,N进制就是 “逢N进1”。进制其实就这么简单。它的麻烦之处在于各种进制之间的转换。
一、十进制整数转N进制
1.十进制转二进制
除2取余法:连续除以2,直到商为0,逆序排列余数。
例如十进制数57转为二进制数:
序号 | 被除数 | 商 | 余数 | 备注 |
1 | 57 | 28 | 1 | 57除以2得28余1 |
2 | 28 | 14 | 0 | 28除以2得14余0 |
3 | 14 | 7 | 0 | 14除以2得7余0 |
4 | 7 | 3 | 1 | 7除以2得3余1 |
5 | 3 | 1 | 1 | 3除以2得1余1 |
6 | 1 | 2 | 1 | 1除以2得0余1(商为0,结束) |
逆序排列余数(从下往上)得到二进制数:111001B。
注意除2取余每次都是用上次的商作为被除数,即:取商除2取余。
2.十进制转二进制
十进制转N进制与转二进制算法如出一辙,即除n取余法。
比如把十进制数107转换成八进制:
107除以8等于13,余数是3;
13除以8等于1,余数是5;
1除以8等于0,余数是1。
把这些余数倒序排列,就是153,这就是十进制数107的八进制表示。
二、N进制整数转十进制数
1.二进制转十进制
按位权展开:各位数字乘以位权的和。
这是因为现行的计数方法都是采用“位值法(Positional Value Algorithm)”,它的特点是各位数字所表示值的大小不仅与该数字本身的大小有关,还与该数字所在的位置有关。位置所代表的权重称为位权,简称权。
看似很高大上,但其实这种表示方法我们非常熟悉,比如:9527=9*1000+5*100+2*10+7。
上面算式中的1000、100、10、1就是位权,因此我们可以得到一个公式:数=∑数字*位权。
1000、100、10、1分别对应10^3、10^2、10^1、10^0,这下你看出门道没?底数代表进制,指数代表位置(从个位起向左依次为0、1、2、……)。
那么,你自然能联想到,二进制位权的底数就应该是2。
如二进制数111001.000B数字与位权的对应关系:
按位权展开求和即可得到对应的十进制数:
其实,本质上来说,位值法的位权表示的是倍数关系:每一位都是后一位的N倍。N就是指N进制,十进制就表示每一位是后一位的10倍,二进制就表示每一位是后一位的2倍。这其实就是位权展开法的原理。
2.N进制转十进制
其他进制数转十进制数同理,八进制数的位权是以8为底的幂,十六进制数的位权是以16为底的幂。位权的底数部分被称为“基数”,二进制的基数是2,十进制的基数是10,八进进制的基数是8,十六进制的基数是16。
比如8进制数字153,按位权展开求和为:
三、进制快捷转换
因2的3次方是8,所以二进制转为八进制时,可3个一组进行转换,每组内位权的指数编号重新从零开始计算。如111001B转为八进制数:
同理,由于2的4次方是16,二进制转十六进制时,可4个一组进行转换(优先满足右侧分组,因为最高位可以补零),如111001B转为十六进制数:
四、十进制小数转二进制数
与整数“除2取余法”的门道儿正相反,采用“乘2取整法”。
乘2取整法:用2乘十进制小数,将积的整数部分取出,再用2乘余下的小数部分,如此循环,将每步取出的整数部分顺序排列,即为小数的二进制。
例如,十进制数32.12转为二进制数:
整数部分32用除2取余得到二进制数为100000。
小数部分为0.12,用乘2取整法:
序号 | 乘2 | 取整 | 备注 |
1 | 0.12×2=0.24 | 0 | |
2 | 0.24×2=0.48 | 0 | |
3 | 0.48×2=0.96 | 0 | |
4 | 0.96×2=1.92 | 1 | 取整后,后续运算因数变为1.92-1=0.92 |
5 | 0.92×2=1.84 | 1 | 取整后,后续运算因数变为1.84-1=0.84 |
6 | 0.84×2=1.68 | 1 | 取整后,后续运算因数变为1.68-1=0.68 |
7 | … | … | … |
注意乘2取整每次都是用上次积的小数部分作为乘数,即:取小乘2取整。
与整数不同的是,乘2取整可能会无限运算下去,需按题目精度要求截取足够位数。
顺序排列(从上到下)取出整数,得到小数部分的二进制数为.000111。
故最终求得二进制小数:100000.000111。
总结:整数部分,除2取余、逆序排列;小数部分,乘2取整、顺序排列。