最常见的进制之间的转化

1.首先是二进制,八进制,十六进制转十进制.

每一个进制(二进制,八进制,十六进制)的从右往左数,
第一位的权值就是对应进制的0次方,第二位的权值就是对应进制的二次方
,以此类推,然后对应位的数乘以对应位的权值再相加起来就是该进制对应的十进制的数是多少.
例:十六进制2AF5换算成十进制:
用竖式计算:
第0位: 5 * 16^0 = 51位: F * 16^1 = 2402位: A * 16^2= 25603位: 2 * 16^3 = 8192
相加等于10997.
直接计算就是:
5 * 16^0 + F * 16^1 + A * 16^2 + 2 * 16^3 = 10997
其他进制转十进制方法一样.
有小数的次方就跟着减.
例十六进制的0.110进制,就是1*16^-1,然后以此类推.(其他进制也是如此)

2:八进制,十进制,十六进制转二进制.

(先讲这个,因为后面很多需要利用二进制作为中间转换)

“`
#I: 八进制换二进制
八进制转二进制:
  整数部分:从后往前每一位按十进制转化方式转化为三位二进制数,缺位处用0补充 .
(想也知道,因为二进制的111刚好是7,所以就可以根据这个来进行转化)
  例如:11001补充后是011001.
  八进制数换成二进制:0=000;1 = 001;2 = 010;3 =011;4 = 100;5 = 101;6 =110;7 = 111
  011=3,001=1,所以31(八进制)=011001(二进制)

```
   #III:十进制换二进制
   1. 十进制整数转换为二进制整数

十进制整数转换为二进制整数采用"除2取余,逆序排列"法。
具体做法是:用2整除十进制整数,可以得到一个商和余数;
再用2去除商,又会得到一个商和余数,如此进行,直到商为0时为止,
然后把先得到的余数作为二进制数的低位有效位,
后得到的余数作为二进制数的高位有效位,依次排列起来。

十进制整数转二进制
如:(255)10=(111111112
255/2=127=====余1
127/2=63======余1
63/2=31=======余1
31/2=15=======余1
15/2=7========余1
7/2=3=========余1
3/2=1=========余1
1/2=0=========余1
就是这样来的.
   #II:十六进制换二进制
   首先把十六进制数04271544中的每一位数转换为二进制数,每个数要分四位,不足四位的前面加零,请看下面演示:
0  0000
4  0100
2  0010
7  0111
1  0001
5  0101
4  0100
4  0100
将得出四位二进制数串连起来就是结果了
所以,十六进制04271544转换二进制为
100001001110001010101000100 (前面的0就省了)

3: 二进制,八进制,十进制转十六进制.

“`
#I:二进制转十六进制

16进制就有16个数,0~15,用二进制表示15的方法就是1111,
从而可以推断出,16进制用2进制可以表现成0000~1111,顾名思义,也就是每四个为一位。举例:
00111101可以这样分:
0011|1101(最高位不够可用零代替),对照着二进制的表格,1024 512 256 128 64 32 16 8 4 2 1
(一般例举这么多就够了,如果有小数的话就继续往右边列举,如0.5 0.25 0.125 0.0625……)
1024 512 256 128 64 32 16 8 4 2 1
0 0 1 1| 1 1 0 1
左半边=2+1=3 右半边=8+4+1=13=D
结果,0111101就可以换算成16进制的3D.

```
    #II:八进制换十六进制
    这个转化没有现成的转化方式,只能先将八进制换成二进制,然后再转换成十六进制.所以方法就是这样.(转化方式上面有)
八进制转换为16进制数,使用二进制作为中间结果会比使用十进制还简单,例如:

八进制的:1234567

转换为二进制是每个数字转换为三位二进制:001 010 011 100 101 110 111

然后把这些数字从右边开始进行按四位分组:0 0101 0011 1001 0111 0111

然后从右边每四位组依次对应一个16进制数:053977 

即 (12345678=(05397716
      #II:十进制转十六进制
例:十进制的1610(有了二进制换十六进制的基础,就有两种方法)
直接转16进制:
1610/16=100……10(A);//想想他们之间的关系,就知道为什么要除了.
100 /16=  6……46   /16=  0……6;

故:1610(10)=64A(16).

先转2进制:
1610/2=805……0805 /2=402……1402 /2=201……0201 /2=100……1100 /2=50 ……050  /2=25 ……025  /2=12 ……112  /2=6  ……06   /2=3  ……03   /2=1  ……11   /2=0  ……1.
1610(10)= 0110 0100 1010(2)
1610(10)= 64A(16)

4:二进制,十进制,十六进制转八进制.

有了上面的基础,这里就只说说十六进制换八进制
是 先转化成2进制,再转换成8进制: 
0 0000 
1 0001 
2 0010 
3 0011 
4 0100 
5 0101 
6 0110 
7 0111 
8 1000 
9 1001 
A 1010 
B 1011 
C 1100 
D 1101 
E 1110 
F 1111 

先每四位一组转换成2进制 
例如: 
3BC24 
分别对应到上表 就是: 
3 0011 
B 1011 
C 1100 
4 0100 

连起来就是: 
0011 1011 1100 0100 

再按照每三个一组分组: 
0 011 101 111 000 100 

对应到8进制: 
(其实跟上表的前一半是一样的): 
0 000 
1 001 
2 010 
3 011 
4 100 
5 101 
6 110 
7 111 

0 011 101 111 000 100 
0__3__5__7__0__4 
所以8进制就是35704

即(3BC24 )16=(0357048.

其实你会发现10进制转任何进制就是用那个十进制的数除以那个进制,然后再倒着书写即可.

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
using namespace std;
char a[150];
int b[150];
int cnt=0;
void shizhuanji(int x,int jz)
{
    if(x/jz)
        shizhuanji(x/jz,jz);
    cout << x%jz;
}

int main()
{
    int n,jz;
    cin >> n >> jz;
    printf("十进制的%d转成%d进制为",n,jz);
    shizhuanji(n,jz);
    printf("\n");
}

而其他进制换十进制就是对应位权值的关系即可

代码如下:
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
using namespace std;
char a[150];
int b[150];
int cnt=0;
void jizhuanshi(int jz,int *x)
{
    int s=0;
    int ans=0;
    for(int i=0;i<cnt;i++)
    {
        double m=pow(jz,ans);//pow的原型是浮点数,所以必须要用一个db型做中间桥梁!
        //printf("%.2f %d\n",m,x[i]);//帮助理解过程.
        s+=x[i]*m;
        ans++;
        //printf("%d\n",s);
    }
    printf("%d进制的%s转换成十进制为%d\n",jz,a,s);
}
int main()
{
    int jz;
    cin >> jz;
    scanf("%s",a);
    int len=strlen(a);
    for(int i=len-1;i>=0;i--)   b[cnt++]=a[i]-'0';
    jizhuanshi(jz,b);
}

而2,8,16,进制因为数的特殊性常常就用几位代表一个数来进行他们之间的相互转换.(这个代码看完后就自己写了哈)(其实也不难,很好写的)
所以希望看完这个你能懂起进制之间的关系.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值