1. 关于一个二进制数转为八进制数的c语言编程
因为你的输入是%c,也就是字符型的‘1’‘0’
不是数字1,0
计算中用到的是数字,不是字符,所以需要把字符转化为数字,ascII码"1" 是49,“0”是48
ch - '0'
若ch = ‘1’,则49-48 = 1
即转化为数字1
2. C语言中的二进制、八进制、十进制之间的转换
二进制的1101转化成十进制
1101(2)=1*2^0+0*2^1+1*2^2+1*2^3=1+0+4+8=13
转化成十进制要从右到左用二进制的每个数去乘以2的相应次方
不过次方要从0开始
十进制转二进制:
用2辗转相除至结果为1
将余数和最后的1从下向上倒序写
就是结果
例如302
302/2
=
151
余0
151/2
=
75
余1
75/2
=
37
余1
37/2
=
18
余1
18/2
=
9
余0
9/2
=
4
余1
4/2
=
2
余0
2/2
=
1
余0
1/2
=
0
余1
故二进制为100101110
二进制转八进制
在把二进制数转换为八进制表示形式时,对每三位二进制位进行分组,应该从小数点所在位置分别向左向右划分,若整数部分倍数不是3的倍数,可以在最高位前面补若干个0;对小数部分,当其位数不是的倍数时,在最低位后补若干个0.然后从左到右把每组的八进制码依次写出,即得转换结果.
你算一下就知道了啊
比如110=2^2+2+0=6
二进制转十六进制
要将二进制转为16进制,只需将二进制的位数由右向左每四位一个单位分隔,分的不够的前边补零,用四位数的二进制数来代表一个16进制。转换表如下,括号内为十六进制
0000(0)
0001
(1)
0010
(2)
0011
(3)
0100
(4)
0101
(5)
0110
(6)
0111
(7)
1000
(8)
1001
(9)
1010(A)
1011
(B)
1100
(C)
1101
(D)
1110
(E)
1111
(F)
例如:10101011划分为1010
1011,根据转换表十六进制为AB
3. c语言中将二进制数(001101101110.110101)b转换成八进制数怎么算
三位二进制对应一位8进制。
所以 以小数点分隔,然后转换就行了
001 101 101 110.110 101
每三个对应一个
就是
1 5 5 6 . 6 5
结果就是
1556.65
4. 二进制数转换为对应的十进制、八进制和十六进制数,C语言
#include <stdio.h>
#include <string.h>
char s[128];
int main(){
printf("Input a binary number:");
gets(s);
int len,i,n=0;
len=strlen(s);
for (i=0; i<len; i++) {
if(s[i]=='1'){
n<<=1;
n|=1;
}
else{
n<<=1;
}
}
printf("The number is %d in decimal.\n",n);
printf("The number is %o in octal.\n",n);
printf("The number is %X in octal.\n",n);
}
5. 用c语言编写八进制转换二进制程序
现在提供一个从2到16之间的互相转换程序,可以实现小数,整数,负数,正数等之间的互相转换,楼主可以根据自己的需要稍作修改即可满足你自己的需要,O(∩_∩)O~
源程序如下:
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
void main()
{
int i,j,k,m,n,x,b[20],h[20],c,t;
double d,r,p=0;
char a[20];
printf("请输入一个任意进制的数:");
gets(a);//在头文件<string.h>中定义
printf("请输入此数为何种进制的数:");
scanf("%d",&t);
printf("请输入要转换成的进制(1<N<=16):");
scanf("%d",&n);
m=strlen(a);//求字符串的长度
x=m;
for(k=0,j=0;k<m;k++)//主要是分段,以小数点为界限
{
if(a[k]=='.')
{
x=k;
break;
}
if(a[k]=='-')
j++;
}
for(k=x+1;k<m;k++)//修正输入过程中可能会输入不止一个“.”和“-”的问题
{
if(a[k]=='-')
j++;
if(j>1)//如果其中再次遇到“-”证明输入有误,终止程序
{
printf("ERROR!\n");
exit(0);
}
if(a[k]=='.')//如果其中再次遇到“.”证明输入有误,终止程序
{
printf("ERROR!\n");
exit(0);
}
}//注意:前面两个for()循环可以合并成一个循环,这样就可以节约很多的代码的,但是相对而言,两段程序的时间复杂度一样,修改后的代码如下:
/*
i=0;
j=0;
for(k=0;k<m;k++)
{
if(a[k]=='.')
{
i++;
x=k;
}
if(a[k]=='-')
j++;
if(i>1||j>1)
{
printf("ERROR!\n");
exit(0);
}
}*/
for(j=x-1;j>=0;j--)
{
if(a[j]=='-')//符号的处理
break;
if(a[j]=='A')
r=10;
else
if(a[j]=='B')
r=11;
else
if(a[j]=='C')
r=12;
else
if(a[j]=='D')
r=13;
else
if(a[j]=='E')
r=14;
else
if(a[j]=='F')
r=15;
else
if(a[j]<48||a[j]>57&&a[j]<65||a[j]>70)//修正程序输入合不合法问题的判断,此处采用ASCII值进行编辑
//if(a[j]>='G'&&a[j]<='Z'||a[j]>='a'&&a[j]<='z')//此段程序不能判断像输入&、%、#等字符的错误判断
{
printf("ERROR!\n");
exit(0);//在头文件<stdlib.h>中定义,无条件跳出程序的的运行
}
else
r=a[j]-'0';//将字符转换成数字
if(r>=t)
{
printf("ERROR!\n");
exit(0);
}
p=p+r*pow((double)t,(double)(x-j-1));//计算结果
}
if(a[x]=='.')
{
for(j=x+1;j<m;j++)
{
if(a[j]=='A')
r=10;
else
if(a[j]=='B')
r=11;
else
if(a[j]=='C')
r=12;
else
if(a[j]=='D')
r=13;
else
if(a[j]=='E')
r=14;
else
if(a[j]=='F')
r=15;
else
if(a[j]<48||a[j]>57&&a[j]<65||a[j]>70)//修正程序输入合不合法问题的判断,此处采用ASCII值进行编辑
//if(a[j]>='G'&&a[j]<='Z'||a[j]>='a'&&a[j]<='z')//此段程序不能判断像输入&、%、#等字符的错误判断
{
printf("ERROR!\n");
exit(0);
}
else
r=a[j]-'0';//将字符转换成数字
if(r>=t)
{
printf("ERROR!\n");
exit(0);
}
p=p+r*pow((double)t,(double)(x-j));
}
}
if(n==10)//选择性计算,如果是整数就不用进行这一步的计算了,这样可以节约程序的运行时间
{
printf("转换结果为:");
if(a[0]=='-')
{
printf("-");
}
printf("%f",p);
}
else
{
k=p;//强制类型转换,可以使用k=(int)p;代替,从而更加的一目了然
i=0;
while(k)//判定需要转换的数是否变为0
{
h[i++]=k%n;//取余,进行进制转换,但是顺序与正确值相反
k/=n;//转换一位之后进行相应的变化
}
c=0;
//if(p!=(int)p)//选择性计算,如果是整数就不用进行这一步的计算了,这样可以节约程序的运行时间
//{
d=p-(int)p;//取小数部分
while(d!=0)
{
b[c]=(int)(d*n);//算法为×N取整
d=d*n-b[c];
c++;
if(c>=10)
break;//主要是控制小数后面万一出现无限小数的时候好跳出循环以免出现死循环
//}
}
printf("转换结果为:");
if(a[0]=='-')
printf("-");
for(j=i-1;j>=0;j--)//反序输出,大于10的数字进行相应的变化
{
if(h[j]==10)
printf("A");
else
if(h[j]==11)
printf("B");
else
if(h[j]==12)
printf("C");
else
if(h[j]==13)
printf("D");
else
if(h[j]==14)
printf("E");
else
if(h[j]==15)
printf("F");
else
printf("%d",h[j]);
}
if(p!=(int)p)//选择性输出,这样可以节约输出时间和程序的运行时间
{
printf(".");
for(j=0;j<c;j++)//正序输出
{
if(b[j]==10)
printf("A");
else
if(b[j]==11)
printf("B");
else
if(b[j]==12)
printf("C");
else
if(b[j]==13)
printf("D");
else
if(b[j]==14)
printf("E");
else
if(b[j]==15)
printf("F");
else
printf("%d",b[j]);
}
}
if(c>=10)//如果是无限小数则在后以省略号表示
printf("......");
}
printf("\n");//输出换行,以使程序的输出结果美观
}
6. C语言中怎么写二进制转换八进制
为了方便,可以先转成10进制
~~~~~~~~
7. c语言中的数据类型及二进制 八进制 十六进制之间的转换
2的3次方等于8,一位八进制数正好是三位二进制;2的4次方等于16,一位十六进制数正好是四位二进制。
二进制转换成八进制的方法:以小数点为中心,整数部分自右向左分组,小数部分自左向右分组,每三位一组,不足的补零(只有整数的高位和小数的低位才能补零)。后将各组的三位二进制按2的权展开后相加得一位八进制数值。
十六进制分组时每组四位数一组。
四位进制之间的关系
十进制 二进制 八进制 十六进制
0 0000 0 0
1 0001 1 1
2 0010 2 2
3 0011 3 3
4 0100 4 4
5 0101 5 5
6 0110 6 6
7 0111 7 7
8 1000 10 8
9 1001 11 9
10 1010 12 A
11 1011 13 B
12 1100 14 C
13 1101 15 D
14 1110 16 E
15 1111 17 F
16 10000 20 10
如(101001000011.100100)2
(101 001 000 011. 100 100)2
5 1 0 3. 4 4 =(5103.44)8
(1010 0100 0011. 1001)2
A 4 3 9 =(A43.9)16
8. c语言二进制八进制十进制16进制怎么转换
二进制转换成八进制数
(1)二进制数转换成八进制数:对于整数,从低位到高位将二进制数的每三位分为一组,若不够三位时,在高位左面添0,补足三位,然后将每三位二进制数用一位八进制数替换,小数部分从小数点开始,自左向右每三位一组进行转换即可完成。例如:
将二进制数1101001转换成八进制数,则
(001 101 001)2
| | |
( 1 5 1)8
( 1101001)2=(151)8
(2)八进制数转换成二进制数:只要将每位八进制数用三位二进制数替换,即可完成转换,例如,把八进制数(643.503)8,转换成二进制数,则
(6 4 3 . 5 0 3)8
| | | | | |
(110 100 011 . 101 000 011)2
(643.503)8=(110100011.101000011)2
4、二进制与十六进制之间的转换
(1)二进制数转换成十六进制数:由于2的4次方=16,所以依照二进制与八进制的转换方法,将二进制数的每四位用一个十六进制数码来表示,整数部分以小数点为界点从右往左每四位一组转换,小数部分从小数点开始自左向右每四位一组进行转换。
(2)十六进制转换成二进制数
如将十六进制数转换成二进制数,只要将每一位十六进制数用四位相应的二进制数表示,即可完成转换。
例如:将(163.5B)16转换成二进制数,则
( 1 6 3 . 5 B )16
| | | | |
(0001 0110 0011. 0101 1011 )2
(163.5B)16=(101100011.01011011)2
9. 关于c语言中八进制数转二进制数的问题
你的程序我亲自运行过了,去除语法错误和不当。比如返回值的问题。最主要的问题是*(*str + n) = (c / 2) / 2;这几句,你貌似把一个字符ASCII码直接当成了整形的数进行了取整和取余运算。
这肯定是错的,如果你的目的是int和char的转换,
最好是调用下系统函数 atoi 和 itoa进行。
10. C语言中字符串如何转换为二进制、八进制、十进制、十六进制
什么意思,?没懂,,,是说转为 2 8 16进制的整数?
只要是整数 int。就只有大小。没有进制的区别。
所谓的进制,只是为了人为识别。
但是可以把整数,转换为响应进制的字符串。
举例
char num[] = "15";
int val = atoi(num); //字符串转为整数
char tem[16] = {};
_itoa(val,tem,2);//整数转为2进制字符串
_itoa(val,tem,8);//8进制
_itoa(val,tem,16);//16进制
_itoa(val,tem,10);