进制转换
关于进制转换,这是基本上每个人都会学到的,我还还记得高中就有关于进制转换的题。那么在IT行业,这基本上每个程序员都要掌握。
首先,在电脑上我们见到的有二进制,八进制,十进制,十六进制。对比我们平时用的10进制来学习别的进制是个非常好的方法。十进制逢10进1,二进制逢2进1…好了,还是进入正题吧。
1、二进制转十进制
给你一个二进制数:0B10011 要求转换成10进制数,我们高中就学过按权相加法,名字啥的不重要,咱能算就行了。从最右边开始,从右到左给每一位头上按顺序标上0,1,2,…接着把每一位数乘以2的头标次方,再把每一位相加上,其结果就是十进制数,如图:
这里如果熟练的话推荐用8421法(我自己是这么叫的)从右往左依次写1 2 4 8…(2的n次方)
再把二进制数一对比,对应的1上的数字直接相加就得出结果了,我想了想,原理是一样的,只不过熟练的标上8 4 2 1后我们不用乘以2的次方了,运算简便了。
十进制转二进制就是用碾除法
或者用更方便的8421法
2、二进制转八进制
八进制数以0开头,例如072(注意010110也是八进制,因为它没有以0b或0B开头)。怎么转呢
在这里可以用二进制转十进制的按权相加,完全没有问题,但是,这里有个特殊性,一个八进制位相当于三个二进制位,所以可以换种方法计算。我们把二进制分成三个为一组(从右边开始),不足三个补0再把每一组转换成10进制,拼在一起就是我们要的结果了
八进制转二进制按此方法反过来就是了,也就是把每一位八进制数转成三位二进制数,拼起来就是我们要的二进制数。
3、二进制转十六进制
十六进制以0x开头,例如0x89。十六进制逢16进1,过了9以后便用A代表10,B代表11,C代表12,D代表13,E代表14,F代表15
二进制转十六进制和转八进制类似,只不过这里是把4个二进制位转成一个十六进制位
关于八进制和十六进制和别的进制转十进制,按照二进制的按权相加法就行,这里不再赘述。
附:一个关于进制转换的面试题
567*456=150216在n进制下成立,问n为多少
解答:个位数相乘67=42 在10进制的情况下,末尾应该为2,但在几进制下变成了150216中的6了。
那应该是2作为了前一位的个数,然后n进制化了;
两个个位相乘的结果67=42 在对n进制取余后为6
列下了这个式子 42%n=6
42-6=36
因此36中6以上的的因数都可能为n
n=9,12,18,36
因此范围就缩小了
(5n2+6n+7)*(4n2+5n+6)=20n4+49n3+88n^2+71n+42 1
n5+5n4+2n^2+n+6 … 2
最后将进制数挨个带入,如果1式和2式相等,那么即为结果
2
最后将进制数挨个带入,如果1式和2式相等,那么即为结果
最终结果为 18