C语言进制转换
前言
闲着没事写写玩玩的。
目录
1.十进制转二进制/八进制/十六进制
2.二进制/八进制/十六进制转十进制
3.二进制/八进制/十六进制之间的互相转换
1.十进制转二进制/八进制/十六进制
1.1.十进制转二进制
数学上的方法是除以2,倒取余数,例如:
按照从下往上的顺序写,就是1010.
那么代码上面,只需要一个循环即可:
while(dec){
bin[k]=dec%2;
dec/=2;
k++;
}
注意是倒取余数,因此输出的时候翻转一下即可,从k-1到0.
#include<iostream>
#include<stdio.h>
int dec;
int bin[100];
int main(){
scanf("%d",&dec);
int k=0;
while(dec){
bin[k]=dec%2;
dec/=2;
k++;
}
for(int i=k-1;i>=0;i--){
printf("%d",bin[i]);
}
}
1.2.十进制转八进制
毫无难度,和之前上面的写法一样,只是把2换成8.
#include<iostream>
#include<stdio.h>
int dec;
int oct[100];
int main(){
scanf("%d",&dec);
int k=0;
while(dec){
oct[k]=dec%8;
dec/=8;
k++;
}
for(int i=k-1;i>=0;i--){
printf("%d",oct[i]);
}
}
1.3.十进制转十六进制
注意:十六进制中包含数码ABCDEF,因此输出时需要经过特殊转换。方法是在输出的时候加上一个switch case。
#include<iostream>
#include<stdio.h>
int dec;
int hex[100];
int main(){
scanf("%d",&dec);
int k=0;
while(dec){
hex[k]=dec%16;
dec/=16;
k++;
}
for(int i=k-1;i>=0;i--){
if(hex[i]<=9)printf("%d",hex[i]);
else{
switch(hex[i]){
case 10:putchar('A');break;
case 11:putchar('B');break;
case 12:putchar('C');break;
case 13:putchar('D');break;
case 14:putchar('E');break;
case 15:putchar('F');break;
}
}
}
}
2.二进制/八进制/十六进制转十进制
2.1.二进制转十进制
二进制的每一位都有对应的权值,类似十进制个位表示1,十位表示10,百位表示100等,二进制第一位表示1,第二位2,第三位4,第四位8,以此类推。
如图,把每一位权值乘以这一位的数字即可。
注意在写的时候,语法方面的一些小问题,写在注释里面了:
#include<iostream>
#include<stdio.h>
#include<string.h>
int dec;
char bin[100];
int main(){
fgets(bin,sizeof(bin),stdin);
//也可用gets(bin)代替,但是gets被标准列为不安全的函数,并且在部分环境会报错
int p=1;//权值
for(int i=strlen(bin)-2;i>=0;i--){
//这里从strlen(bin)-2开始,因为fgets会把换行符一起读入进来,从strlen(bin)-1开始会有问题
dec+=p*(bin[i]-'0');
p*=2;
}
printf("%d",dec);
}
2.2.八进制转十进制
只是把权值从每次乘2到乘8,其他无变化。
#include<iostream>
#include<stdio.h>
#include<string.h>
int dec;
char oct[100];
int main(){
fgets(oct,sizeof(oct),stdin);
int p=1;//权值
for(int i=strlen(oct)-2;i>=0;i--){
dec+=p*(oct[i]-'0');
p*=8;
}
printf("%d",dec);
}
2.3.十六进制转十进制
注意,这里十六进制中有A-F的字母,这里我考虑用到一个办法,使用ref数组,ref[c]就表示c字符对应的数字,例如ref['A']=10。
代码如下,最前面预处理了ref数组的值。
#include<iostream>
#include<stdio.h>
#include<string.h>
int dec;
char hex[100];
int ref[255];
int main(){
for(int i='0';i<='9';i++){
ref[i]=i-'0';
}
for(int i='A';i<='F';i++){
ref[i]=i-'A'+10;
}
fgets(hex,sizeof(hex),stdin);
int p=1;//权值
for(int i=strlen(hex)-2;i>=0;i--){
dec+=p*ref[hex[i]];
p*=16;
}
printf("%d",dec);
}
3.二进制/八进制/十六进制之间的互相转换
我们知道,这类进制之间的转换,可以使用三/四位一段的方法,例如:
就是把0x1234转二进制的结果。
这里只以十六进制转二进制为例,我们可以使用数组存储。
#include<iostream>
#include<stdio.h>
#include<string.h>
char* bin[16]={
"0000","0001","0010","0011","0100","0101","0110","0111",
"1000","1001","1010","1011","1100","1101","1110","1111",
};
char hex[100];
int ref[255];
int main(){
for(int i='0';i<='9';i++){
ref[i]=i-'0';
}
for(int i='A';i<='F';i++){
ref[i]=i-'A'+10;
}
fgets(hex,sizeof(hex),stdin);
for(int i=0;i<strlen(hex)-1;i++){
printf("%s",bin[ref[hex[i]]]);
}
return 0;
}
全文完。