题外话>代码不够完善自行判断借鉴,有错误欢迎uu们指正
一、二(八)进制转十进制(问就只有正整数)
1.1 基本思路与概念
主要的代码思路:按权展开
Q:什么是按权展开?
百度 A:数转换成十进制数时,按照权重从高位到低位的顺序展开并相加。
Q:什么是权重(位权)?
百度 A:指数制中每一固定位置对应的单位值,例:
理论咱也听不明白,直接上例子
注:位要从0开始算,不是从1
1.2 代码实例
#include <stdio.h>
#include <math.h> //没有这个头文件运用不了pow()
void main()
{
int data,num,i=0,sum=0;
printf("请输入一个二进制数:");
scanf("%d",&num);
while(num>0)
{
data=num%10;
num=num/10;
sum=sum+data*pow(2,i);
i++;
}
printf("%d",sum);
}
1.2.1 pow()的使用
- pow()的作用:用来求 x 的 y 次幂(次方)
在程序运行过程中,pow()的运用类似于指数函数:(这排版看的我好难受)
double pow(double m,double n)——>pow(m,n)
如实际代码中:
pow(2,i) //表示的是2的i次方
程序是以按权展开的想法来编写的;
所以在已知转换进制中,如现在是二进制转十进制,所以m是常量,n是自变量;
在八进制转十进制中
pow(8,i) //表示的是8的i次方
1.2.2 重要语句
我们假设,输入的二进制
data=num%10; //num表示输入的二进制值
则data所算出的便是 ~ ;
num=num/10; //第一个的num值将会改变,可以用其他变量代替
这条语句作用是为了移位,比如10101100 / 10 = 1010110,来换算data的值
1.3 实现效果
二、二进制转十六进制
2.1 基本思路与概念
关于二进制转十六进制我想到了两种方法:
①二进制转十进制,十进制再转十六进制;
②根据输入值的长度,判断是否移位补零;
现只有第一种方法实现,等后续有能力补充第二种方法。
此次代码主要对ASCII码值和数值字符之间转换熟悉掌握。
注:有个无法判断输入值是否为有效值的小bug后续有机会(大饼)更新(不好意思地挠头
2.2 代码实例
#include <stdio.h>
#include <math.h>
int main()
{
/*******这块为二进制转化为十进制******/
int data,num,i=0,sum=0;
char a[100];
/*******这块为二进制转化为十进制******/
long int shang;
int k=0,j,temp;
shang = sum;
while(shang!=0)
{
temp = shang % 16;
/**********************/
/****这块代码在下方****/
/*********************/
a[k]= temp;
k=k+1;
shang = shang / 16;
}
printf("十六进制值: ");
for (j = k -1 ;j>= 0;j--)
printf("%c",a[j]);
return 0;
}
<这块代码在下方>我有两种写法,两种写法相差不多,都与ASCII码值有关,方法后附上真值表
第一种:
if( temp < 10)
{
temp =temp + 48;
}
else
{
temp = temp + 55; //例如:temp=10, new=65 ASCII换算为'A'
}
第二种:
注:这个方法需要多加一个 char hex; 的变量语句
if (temp >= 0 && temp <= 9)
{hex =temp + '0';
}
else {
hex = temp - 10 + 'A';
}
附上数字字符ASCII真值表:
字母真值:A-Z(65-90) ,a-z(97-122),相差32
2.3 实现效果
2.4 一种无比简单的方法
之前好奇试了试这个方法,感觉蛮有意思的,如果大家只是想要结果可以通过这个方式
#include <stdio.h>
int a;
void main()
{
scanf("%d",&a);
printf("十六进制为%x",a);
}
效果如下:
三、十进制转二(八)进制
3.1 基本思路与概念
主要的代码思路:除2(或8)取余,逆序排列(左边为二进制换算,右边为八进制换算)
3.2 代码实例
#include <stdio.h>
void main()
{
int data,a[100],i=0,j;
printf("请输入一个十进制数:");
scanf("%d",&data);
while(data>0)
{
a[i]=data%2;
data=data/2;
i++;
}
for(j=i-1;j>=0;j--) //j=i-1的原因是i++导致多+1; 倒序所以j--
{
printf("二进制为%d",a[j]);
}
}
四、十六进制转二进制
4.1 基本思路与概念
主要运用到了switch和case的配合;
4.1.1 switch()的使用
switch(条件)
{
case 值1 :
语句段;
break;
case 值2 :
语句段;
break;
……
default :
语句段;
//break;
}
有关default的一些点:
① default 执行条件 是在找不到case 的条件下执行;
② 可以不写 default 这个条件和后面的语句段,或者语句段为空;
③ default 的位置可以在switch{}内的任意位置,若不在所有case的后面则必须加上break;语句,
否则无法跳出循环。不推荐将default放在前面。
具体实例看后面的代码。
4.2 代码实例
第一种写法:
#include <stdio.h>
int i;
char numb[100];
void main()
{
printf("请输入一个十六进制数: ");
scanf("%s", numb);
printf("二进制表示为: ");
for (i = 0; numb[i] != '\0'; i++) {
switch(numb[i])
{
……………………
}
}
第二种写法:
这种写法比第一种写法多了一个标志位flag,通过flag的0和1转变来判断是否有错误字符
#include <stdio.h>
#include <string.h> //这个头文件中包含strlen()
void main()
{
char a[10],i,flag=0;
printf("请输入一个十六进制数: ");
scanf("%s",a);
for (i=0;i<strlen(a);i++)
{
if((a[i]>='0'&&a[i]<='9')||(a[i]>='a'&&a[i]<='f')||(a[i]>='A'&&a[i]<='F') )
{flag=0;}
else
{flag=1;break;}
}
if(flag==0)
{
printf("二进制表示为: ");
for(i=0;i<strlen(a);i++)
{
switch(a[i])
{
…………………………
}
}
}
else
printf("请重新执行!!");
}
strlen() //计算字符串的长度
sizeof() //获取某个数据类型所占用空间的字节数
swich中所包含的语句块:(实现十六进制中的A~F与二进制中值的转换)
case '0':
printf("0000");
break;
case '1':
printf("0001");
break;
case '2':
printf("0010");
break;
case '3':
printf("0011");
break;
case '4':
printf("0100");
break;
case '5':
printf("0101");
break;
case '6':
printf("0110");
break;
case '7':
printf("0111");
break;
case '8':
printf("1000");
break;
case '9':
printf("1001");
break;
case 'A':
case 'a':
printf("1010");
break;
case 'B':
case 'b':
printf("1011");
break;
case 'C':
case 'c':
printf("1100");
break;
case 'D':
case 'd':
printf("1101");
break;
case 'E':
case 'e':
printf("1110");
break;
case 'F':
case 'f':
printf("1111");
break;
/****这三行是属于方法一的****/
default:
printf("请重新输入\n");
return;
/****这三行是属于方法一的****/