进制转换算法

 第一篇博客就写个进制转换的总结吧。简单、轻松、愉快地开始博客之旅大笑

 一般常用进制为二、八、十、十六。那么我们先开始讨论这四种进制之间的相互转化。

1.十进制转化为二、八、十六进制。

 十进制→二进制

 方法:除2取余法,即每次将整数部分除以2,余数为该位权上的数,而商继续除以2,余数又为上一个位权上的数,这个步骤一直持续下去,直到商为0为止,最后读数时候,从最后一个余数读起,一直到最前面的一个余数。 

#include<iostream>
using namespace std;
int main(){
	int a,n,i=0;
	int b[100];
	cin>>n;
	do{
		a=n%2;
		b[i++]=a;
		n=n/2;
	}while(n!=0);
	for(int j=i-1;j>=0;j--){
		cout<<b[j];
	} 
	cout<<endl;
	return 0;
}

  十进制→八进制同理,除8取余法,只需将上面代码中的2改为8即可。

十进制→十六进制同理,除16取余法,改动稍多一点点而已,还是贴上代码吧。

#include<iostream>
#include<string>
using namespace std;
int main(){
	int a,n,i=0;
	char b[100],c[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
	cin>>n;
	do{
		a=n%16;
		b[i++]=c[a];
		n=n/16;
	}while(n!=0);
	for(int j=i-1;j>=0;j--){
		cout<<b[j];
	} 
	cout<<endl;
	return 0;
}

2.二、八、十六进制转化为十进制。

  二进制→十进制

 方法:二进制数从低位到高位(即从右往左)计算,第0位的权值是2的0次方,第1位的权值是2的1次方,第2位的权值是2的2次方,依次递增下去,把最后的结果相加的值就是十进制的值了。

#include<iostream>   
#include<string.h> 
#include<math.h> 
using namespace std; 
int main() {     
    char a[20],b[10]; 
    unsigned long c=0;
	int i=0,j;  
    scanf("%s",&a);     
    j=strlen(a);   
    for(i=0;i<j;i++){  
        b[i]=a[i]-'0';  
        c=c+b[i]*pow(2,j-i-1);  
    }  
    printf("%u",c);  
    return 0;  
}

 八进制→十进制同理,仅需把2更改为8即可。
  十六 进制→十进制代码如下。
#include<stdio.h>
#include<math.h>
#include<string.h>
int main() {
	int a[20]; 
	char b[10]; 
	unsigned long c=0;
	int i=0,j;
	scanf("%s",&b);   
	j=strlen(b); 
	for(i=0;i<j;i++){
		if(b[i]>='0'&&b[i]<='9')
		a[i]=b[i]-'0';
		if(b[i]>='A'&&b[i]<='F')
		a[i]=b[i]-'A'+10;
		if(b[i]>='a'&&b[i]<='f')
		a[i]=b[i]-'a'+10;
		c=c+a[i]*pow(16,j-i-1);
	}
	printf("%u",c);
	return 0;
}
3.二进制转化为八、十六进制。
 二进制→八进制
 方法:取三合一法,即从二进制的小数点为分界点,向左(向右)每三位取成一位,接着将这三位二进制按权相加,然后,按顺序进行排列,小数点的位置不变,得到的数字就是我们所求的八进制数。如果向左(向右)取三位后,取到最高(最低)位时候,如果无法凑足三位,可以在小数点最左边(最右边),即整数的最高位(最低位)添0,凑足三位。

#include<iostream>
#include<math.h>
#include<string.h>
using namespace std;
int main() {
	string a;
	int i,j,b[10];
	cin>>a;
	j=0;
	//修正位数 
	if(a.length()%3==1)a="00"+a;
	if(a.length()%3==2)a="0"+a;
	//二进制转八进制
	for(i=0;i<a.length();i+=3){
		b[j]=(a[i]-'0')*4+(a[i+1]-'0')*2+(a[i+2]-'0');
		++j;
	}
	for(i=0;i<j;i++){
		cout<<b[i];
	}
	cout<<endl;
	return 0;
}

 二进制→十六进制

 方法:取四合一法,即从二进制的小数点为分界点,向左(向右)每三位取成一位,接着将这三位二进制按权相加,然后,按顺序进行排列,
小数点的位置不变,得到的数字就是我们所求的八进制数。如果向左(向右)取三位后,取到最高(最低)位时候,如果无法凑足三位,
可以在小数点最左边(最右边),即整数的最高位(最低位)添0,凑足三位。

#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
int main() {
	string a,str;
	int i,j,b[10];
	char c[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
	cin>>a;
	j=0;
	//修正位数 
	if(a.length()%4==1)a="000"+a;
	if(a.length()%4==2)a="00"+a;
	if(a.length()%4==3)a="0"+a;
	//二进制转十六进制
	for(i=0;i<a.length();i+=4){
		b[j]=(a[i]-'0')*8+(a[i+1]-'0')*4+(a[i+2]-'0')*2+(a[i+3]-'0');
		str[j]=c[b[j]];
		++j;
	}
	for(i=0;i<j;i++){
		cout<<str[i];
	}
	cout<<endl;
	return 0;
}
4.八、十六进制转二进制
 八进制→二进制

 方法:取一分三法,即将一位八进制数分解成三位二进制数,用三位二进制按权相加去凑这位八进制数。

#include<iostream>
#include<math.h>
#include<string.h>
using namespace std;
int main() {
	string a;
	int i,j,b[20];
	cin>>a;
	j=0;
	for(i=0;i<a.length();i++){
		b[j]=(a[i]-'0')/4;
		b[j+1]=(a[i]-'0')%4/2;
		b[j+2]=(a[i]-'0')%2;
		j=j+3;
	}
	for(i=0;i<j;i++){
		if(i==0&&b[i]==0) continue;
		if(b[0]==0&&i==1&&b[i]==0) continue;
		cout<<b[i];
	}
	cout<<endl;
	return 0;
}
十六进制→二进制

 方法:取一分四法,即将一位十六进制数分解成四位二进制数,用四位二进制按权相加去凑这位十六进制数。

#include<iostream>
#include<math.h>
#include<string.h>
using namespace std;
int main() {
	string a;
	int i,j,b[20];
	cin>>a;
	j=0;
	for(i=0;i<a.length();i++){
		if(a[i]>='0'&&a[i]<='9'){
		b[j]=(a[i]-'0')/8;
		b[j+1]=(a[i]-'0')%8/4;
		b[j+2]=(a[i]-'0')%4/2;
		b[j+3]=(a[i]-'0')%2;
		j=j+4;}
		if(a[i]>='A'&&a[i]<='F'){
		b[j]=(a[i]-'A'+10)/8;
		b[j+1]=(a[i]-'A'+10)%8/4;
		b[j+2]=(a[i]-'A'+10)%4/2;
		b[j+3]=(a[i]-'A'+10)%2;
		j=j+4;}
	}
	for(i=0;i<j;i++){
		if(i==0&&b[i]==0) continue;
		if(b[0]==0&&i==1&&b[i]==0) continue;
		if(b[0]==0&&b[1]==0&&i==2&&b[i]==0) continue;
		cout<<b[i];
	}
	cout<<endl;
	return 0;
}

5.八进制与十六进制互转

进制→十六进制

 方法:将八进制转换为二进制,然后再将二进制转换为十六进制。

#include <iostream>
#include <string>
using namespace std;
int arr[10000001];
 
int main()
{
    int n,len_str,i,j;
    string str,str2,str3="0123456789ABCDEF";
    cin>>str;
    len_str=str.length();
    str2="";
    // 八进制转换为二进制
    for(i=0;i<len_str;++i)
    {
        switch(str[i])
        {
        case '0':str2+="000";break;
        case '1':str2+="001";break;
        case '2':str2+="010";break;
        case '3':str2+="011";break;
        case '4':str2+="100";break;
        case '5':str2+="101";break;
        case '6':str2+="110";break;
        case '7':str2+="111";break;
        default:break;
        }
    }  
    // 修正位数
    if(len_str%4==1)    str2="000"+str2;
    else if(len_str%4==2)  str2="00"+str2; 
    else if(len_str%4==1)  str2="0"+str2; 
    len_str=str2.length();
    // 二进制转换十六进制
    j=0;
        for(i=0;i<len_str;i+=4){
        arr[j]=(str2[i]-'0')*8+(str2[i+1]-'0')*4+(str2[i+2]-'0')*2+(str2[i+3]-'0');
    	++j;
    }
    for(i=0;i<j;++i){
        if(i==0 && arr[i]==0) continue;
        cout<<str3[arr[i]];
   }
    cout<<endl;
    return 0;
}


 十六进制→八进制

 方法:同理,将十六进制转换为二进制,然后再将二进制转换为进制。

#include <iostream>
#include <string>
using namespace std;
int arr[10000001];
 
int main()
{
    int n,len_str,i,j;
    string str,str2;
    cin>>str;
    len_str=str.length();
    str2="";
    // 十六进制转换为二进制
    for(i=0;i<len_str;++i)
    {
        switch(str[i])
        {
        case '0':str2+="0000";break;
        case '1':str2+="0001";break;
        case '2':str2+="0010";break;
        case '3':str2+="0011";break;
        case '4':str2+="0100";break;
        case '5':str2+="0101";break;
        case '6':str2+="0110";break;
        case '7':str2+="0111";break;
        case '8':str2+="1000";break;
        case '9':str2+="1001";break;
        case 'A':str2+="1010";break;
        case 'B':str2+="1011";break;
        case 'C':str2+="1100";break;
        case 'D':str2+="1101";break;
        case 'E':str2+="1110";break;
        case 'F':str2+="1111";break;
        default:break;
        }
    }  
    // 修正位数
    if(len_str%3==1)    str2="00"+str2;
    else if(len_str%3==2)  str2="0"+str2; 
    len_str=str2.length();
    // 二进制转换八进制
    j=0;
        for(i=0;i<len_str;i+=3){
        arr[j]=(str2[i]-'0')*4+(str2[i+1]-'0')*2+(str2[i+2]-'0');
    	++j;
    }
    for(i=0;i<j;++i){
        if(i==0 && arr[i]==0) continue;
        cout<<arr[i];
   }
    cout<<endl;
    return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值