进制转换(整数)

进制范围

2进制范围是0和1,10进制翻译是0-9,16进制范围是0-F(15),32进制范围0-V(31),如果要表达31,在32进制中只需要用一个字符V就可以表示,而用2进制表示则需要5位2进制11111,因此,进制越大,表现形式越短,相反进制越小,表现形式越长

各进制前缀

为了区别于十进制,要表示其他进制,就必须加入前缀或后缀,一般加入前缀更常用,不区分大小写。

在16进制中100等于10进制的256,所以不同进制间相同的写法,表示的数并不相同。

printf("0b100"); //==10进制的 4
printf("0100"); //==10进制的 64
printf("0x100"); //==10进制的 256
printf("100"); //==10进制的 10

同样的数字形式,但进制不同时,如100和0x100,进制大的数,值更大。

任意进制到十进制的转换

系数乘以基数的权次幂相加

10进制转10进制示例图:

下面是一些练习:

//16进制转10进制
0x200
2*16^2 + 0*16^1 + 0*16^0
=2*(256) + 0 + 0
=512

0x3456
3*16^3 + 4*16^2 + 5*16^1 + 6*16^0
3*4096 + 4* 256 + 5*16 + 6
=12288 + 1024 + 80 + 6
=13398

0x4a
4*16^1 + 10*16^0
=64 + 10
=74

0x3c6
3*16^2 + 12*16^1 +6*16^0
=768 + 192 + 6
=966

//8进制到10进制
057 
5*8^1 + 7*8^0
=40 + 7
=47

03245
3*8^3 + 2*8^2 + 4*8^1 + 5*8^0
=3*512 + 2*64 + 4*8 +5
=1536 + 128 + 32 + 5
=1701

32进制到10进制(32进制貌似没有统一的前缀)
1v1
=1*32^2 + 31*32^1 + 1*32^0
=1*1024 + 31*32 + 1
=2017

M2VV
=22*32^3 + 2*32^2 + 31*32^1 + 31*32^0
=22*32768 + 2*1024 + 992 + 31
=723967

ps: 8进制是不会有59或者88这样的数字的,8进制中最大的数字表现形式是7,不管是首位还是末位,都不会出现7以上的数字,如81也不会出现在8进制,和2进制形式不会出现2及以上的数同理。

可以在计算器程序员模式中输入不同进制来查看它对应的10进制,可以验算我们的结果。

假设进制为m,数字的位数为n,则n位m进制数所能表达的最大数字是m^n-1

999=10*10*10 // 3位10进制所能表达的最大数 10^3-1
0b111=2*2*2  // 3位2进制所能表达的最大数 2^3-1
0xFFFF=F*F*F*F  // 4位16进制所能表达的最大数 16^4-1

10进制转换成任意进制

除基倒取余数

用目标数直接除以基数(进制),之后倒着取出余数,就是目标数的2进制形式

练习:

//10进制转2进制
345/2=172...1
172/2=86...0
86/2=43...0
43/2...21...1
21/2=10...1
10/2=5...0
5/2=2...1
2/2=1...0
1/2=0...1
=101011001

//10进制转8进制
65/8=8...1
8/8=1...0
1/8=0...1
=101

//10进制转16进制
123/16=7...11(b)
7/16=0...7
=7b

//10进制转32进制
789/32=24...21(L)
24/32=0...24(O)
=OL 

除了十进制转二进制外,十进制转其他进制都不太适合我们心算,因此我们应该先将十进制转换成二进制,再用得到的二进制转换成其他进制会更方便运算。这种方式就是8421码。