进制转换是十分常见的,今天我就分享一些 X进制 转 X进制
而且,其实有些就是对照着反过来
先把这些吃透吧:
* D :Decimal (十进制)
* B :Binary (二进制)
* O :Octal (八进制)
* H :Hexadecimal (十六进制)
* 二进制 以 0b 开头的数字,如:int x = 0b1101111;
二进制 里只有 [0 , 1]
* 八进制 以 0 开头的数字,如:int x = 0157;
八进制 里有 [0 , 1 , 2 , 3 , 4 , 5 , 6 , 7]
* 十进制 就是正常的数字,如:int x = 111;
十进制 里有 [0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9]
* 十六进制 以 0x 开头的数字,如:int x = 0x6F;
十六进制 里有 [0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , A(a)代替10 , B(b)代替11 , C(c)代替12 , D(d)代替13 , E(e)代替14 , F(f)代替15]
* 哦,对了。这里还是提一下这老掉牙的知识点:n0n^0n0 = 1(n可以是任何非零的数(包括整数,小数,正数,负数)) 不知道为什么的点点我
二进制转十进制(整数):
* 首先我们得知道二进制转十进制(B->D)其实就是二进制从右往左,各个位上依次乘以 2x2^x2x即可(x从0开始(当前这位是0也要乘))
* 如:
10011B = ( )D
1 × 242^424 + 0 × 232^323 + 0 × 222^222+ 1 × 212^121 + 1 × 202^020 = 16 + 0 + 0 + 2 + 1 = 19
所以 10011B = 19D
因此,我们可以得到以下代码:
> 十分简洁!
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
十进制转二进制(整数):
* 十进制转二进制(D->B),大家应该并不感到陌生,其实就是不断除以2取余(直到商为0),余数从下往上倒序输出就行啦。
* 如:
35D = ( )B
35 ÷ 2 = 17 …… 1
17 ÷ 2 = 8 …… 1
8 ÷ 2 = 4 …… 0
4 ÷ 2 = 2 …… 0
2 ÷ 2 = 1 …… 0
1 ÷ 2 = 0 …… 1
倒序输出为100011
所以 35D = 100011B
因此,我们可以得到以下代码:
> 简洁明了!
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
二进制转十六进制(整数):
* 稍难一丢丢的转化,会了这个,二进制转八进制(B->O)你也就会了,二进制转十六进制(B->H)就是从最右边起,每四个二进制位为一个十六进制位(就是把这四个二进制位转成十进制(如果 这个十进制数≥10这个十进制数 \geq 10这个十进制数≥10 那么替换成字母)),不足四位添加前导0。记得倒序输出哦!
* 举个例子:
10110B = ( )H
10110 拆成 一个四位和一个一位(1\color{red}11 和 0110\color{blue}01100110)
因为是从右往左,所以先看 0110B
0110B = 6D 加入ve动态数组(代码中有)
然后再看1B
1不足四位,补前导零3个000\color{silver}0000001\color{blak}11
0001B = 1D 加入ve动态数组(代码中有)
然后倒序输出 为16H
所以 10110B = 16H
* 再举个特殊的例子:
101110B = ( )H
101110 拆成 一个四位和一个两位(10\color{red}1010 和 1110\color{blue}11101110)
因为是从右往左,所以先看 1110B
1110B = 14D
显然14≥1014 \geq 1014≥10了,所以要转成字母,14的字母为E,所以将E加入ve动态数组(代码中有)
然后再看10B
1不足四位,补前导零2个00\color{silver}000010\color{blak}1010
0010B = 2D 加入ve动态数组(代码中有)
然后倒序输出 为2EH
所以 101110B = 2EH
因此,我们可以得到以下代码:
> 有点难,慢慢理解哦!
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
二进制转八进制(整数):
* 既然你已经会了二进制转十六进制(B->H),约等于你会了二进制转八进制(B->O),因为二进制转八进制就是从最右边起,每三个二进制位为一个八进制位(就是把这三个二进制位转成十进制),不足三位添加前导0。还是要倒序输出哦!
* 举个例子:
1010B = ( )O
1010 拆成 一个三位和一个一位(1\color{red}11 和 010\color{blue}010010)
因为是从右往左,所以先看 010B
010B = 2D 加入ve动态数组(代码中有)
然后再看1B
1不足三位,补前导零2个00\color{silver}00001\color{blak}11
001B = 1D 加入ve动态数组(代码中有)
然后倒序输出 为12O
所以 1010B = 12O
是不是和二进制转十六进制一样啊!
因此,我们可以得到以下代码:
> 如果你会二进制转十六进制,那你一定会二进制转八进制
> (不会二进制转八进制的说明你得去看医生了哦!)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
八进制转二进制(整数):
* 说白了,就是倒推嘛,既然二进制转八进制是三位二进制数位为一位八进制数位,那反过来,就是以一位八进制数位转成三位二进制数位。
* 给个例子就好理解很多了(对照上面):
1010B = ( )O
12O = ( )B
12拆开,为1和2
2的二进制为010
1的二进制为001
合起来(从右往左)为001010,去前导零为1010。
所以 12O = 1010B
是不是就是二进制转八进制反过来啊!
因此,我们可以得到以下代码:
> 对照着理解哈!不确定对不对,谨慎使用哦!
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
十六进制转二进制(整数):
* 说白了,就是和八进制转二进制和二进制转十六进制差不多,就是倒推嘛,既然二进制转十六进制是四位二进制数位为一位十六进制数位,那反过来,就是以一位十六进制数位转成四位二进制数位。
* 给个例子就好理解很多了(对照上面):
16H = ( )B
16拆开,为1和6
6的二进制为0110
1的二进制为0001
合起来(从右往左)为00010110,去前导零为10110。
所以 16H = 10110B
是不是就是二进制转十六进制反过来啊!
因此,我们可以得到以下代码:
> 也是对照着理解哈!不确定对不对,谨慎使用哦!
> 建议4个(二进制转八进制,八进制转二进制,二进制转十六进制,十六进制转二进制)一起理解
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
十进制转N进制(整数):
* 十进制转N进制(D->N),其实和十进制转二进制(D->B)可以说一模一样,就是不断除以N取余(直到商为0),余数从下往上倒序输出就行啦。
* 如:
35D = ( )(三进制)
也就是要我们将十进制转三进制,那么N=3(三(三进制))
35 ÷ 3 = 11 …… 2
11 ÷ 3 = 3 …… 2
3 ÷ 3 = 1 …… 0
1 ÷ 3 = 0 …… 1;
倒序输出为1022
所以 35D = 1022(三进制)
因此,我们可以得到以下代码:
> 很简单吧!
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
N进制转十进制(整数):
* 首先我们得知道N进制转十进制(N->D),其实和二进制转十进制(B->D)可以说一模一样,就是N进制从右往左,各个位上依次乘以 NxN^xNx即可(x从0开始(当前这位是0也要乘))
* 如:
1022(三进制(上面的例子,可以用来验证)) = ( )D
也就是要我们将三进制转十进制,那么N=3(三(三进制))
1 × 333^333 + 0 × 323^232+ 2 × 313^131 + 2 × 303^030 = 27 + 0 + 6 + 2 = 35D
所以 1022(三进制) = 35D
因此,我们可以得到以下代码:
> 也十分简单
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
> 拉个番外:
十进制小数转二进制小数
* 采用"乘2取整,顺序排列"法:
小数部分(D)乘2,取整数部分(一定是0或1)加入二进制数组中,将小数部分(D)取出,再乘2……重复以上步骤,直到积中小数部分为0(没有小数部分)或者达到所要求的精度为止。
* 如:
10.25(D) = ( )B
整数部分正常算:10(D) = 1010(B)
小数部分:
0.125 × 2 = 0.25 -> 0
0.25 × 2 = 0.5 -> 0
0.5 × 2 = 1.0 -> 1
顺序排列为 001(B)
合起来,点上小数点为:1010.001
所以 10.125(D) = 1010.001(B)
因此,我们能得到以下代码:
> 不确定对不对,谨慎使用哦!
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
> 其实合理利用 ZS_n_D( ) 和 ZS_D_n( )就可以做到N进制转M进制了。
> 不过大部分的函数都得是整数入参,没法处理小数哦。(只有一个可以处理)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
完整版代码:
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
对你有帮助吗?能给我一个小赞嘛?
祝你们每题AC
最后,打三个广告
* 广告1
* 广告2
* 广告3