第一篇博客就写个进制转换的总结吧。简单、轻松、愉快地开始博客之旅
一般常用进制为二、八、十、十六。那么我们先开始讨论这四种进制之间的相互转化。
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;
}