win10耳机仍外放:二进制换十进制

来源:百度文库 编辑:查人人中国名人网 时间:2024/05/02 19:46:27
请教最快捷的心算(就是除去用工具辅助计算)二进制换算十进制的方法

#include<stdio.h>
#include<conio.h>
#define SIZE 1000//SIZE为十进制数字最多位数,可以设置为一任意大小的非负整数
void main()
{
int a[SIZE+1],b[SIZE+1],oct[2*SIZE],hex[SIZE]={0},yushu[4*SIZE]={0},
fuhao=0,i,j,k,t,B,nn,ys;//定义"布尔变量"fuhao以确定符号 变量ys作分段余数 nn为分段被除数
printf("输入你要转换的十进制整数(可以为负数但不能超过%d位),并以#结尾:\n",SIZE);
for(i=1;;i++){
t=getchar();//防止超出数组范围,先将字符放入t中
if(t=='-'){
fuhao=1;
i=0;
continue;
}
if(t=='#'){
break;
}
else
a[i]=t;
}
a[0]=i-1;
printf("你输入了一个有a[0]=%2d位的十进制数,其值为:\n",a[0]);
if(fuhao)
printf("-");
//以下for循环将a数组里的字符转换成数字
for(i=1;i<=a[0];i++)
a[i]-='0';
for(i=1;i<=a[0];i++)
printf("%d",a[i]);
printf("\n");
for(i=1;i<=a[0];i++)//将十进制数放入b数组
b[i]=a[i];

//////////////////////////求二进制数//////////////////////////
for(j=1;;j++){
//第j次作商
for(B=0,i=1,ys=0;i<=a[0];i++){
nn=ys*10+b[i];
ys=nn%2;
b[i]=nn/2;
B=B||b[i];//商的位之间逻辑或,以方便判断商与否达到0
}
yushu[j]=ys;//得到第j个余数
if(B==0)
break;
}
printf("其对应的二进制数为:\n");
if(fuhao)
printf("-");
for(k=j;k>0;k--)//余数倒排
printf("%d",yushu[k]);
printf("\n");

//////////////////////////求八进制数//////////////////////////
printf("其对应的八进制数为:\n");
for(i=1,k=1;;i+=3,k++){
oct[k]=yushu[i+2]*4+yushu[i+1]*2+yushu[i];
if(i+2>=j)
break;
}
if(fuhao)
printf("-");
for(i=k;i>0;i--)
printf("%d",oct[i]);
printf("\n");

//////////////////////////求十六进制数//////////////////////////
printf("其对应的十六进制数为:\n");
for(i=1,k=1;;i+=4,k++){
hex[k]=yushu[i+3]*8+yushu[i+2]*4+yushu[i+1]*2+yushu[i];
if(i+3>=j)
break;
}
if(fuhao)
printf("-");
for(i=k;i>0;i--){
if(hex[i] > 9)
printf("%c",hex[i]-9+'A');
else
printf("%d",hex[i]);
}
printf("\n按任意键退出。");
getch();
}

看看我写的这个10进制向2,8,16位的转换,可能有点帮助!!!

这需要你对二进制转十进制的基本的几个有点熟.
比如:(0001)2=(1)10
(0010)2=(2)10
(0011)2=(3)10
...
(1111)2=(15)10
这几个熟练后,就将二进制四个四个分为一组(从最右边一位开始),一组一组算,这位比较快.

我用过,好用.

心算可以这样地!八位二进制对应十进制的一个值然后想加就可以了如:00010101从右向左,第一位是十进制的 1.2.4.8.16.32.64.128,上面的例子就是1+4+16=21是不是很快啊!

从二进制数的最左边开始,每一位数乘以2的这一位减一次方。比如二进制数11:1*2+1=3,又如110:1*4+1*2+0=6。

楼上的方法不错 或者是用BCD 8421码算也挺快的