来源:http://www.39g.com/html/kaifa/262/2009/10/011415616641.htm
下面这段代码是二进制转换为十进制的计算,通过输入二进制,输出十进制数。运行无误。请大家先看代码,问题在下面
#include"math.h"
main()
{
int a,i,k=-1,y=0;
printf("\n 请输入一个正确的二进制数:");
scanf("%d",&a);
printf("\n%d十进制为:",a);
while(a!=0)
{
i=a%10;
k++;
y+=i*pow(2,k);
a=a/10;
}
printf("%d\n",y);
}
问题是 如果将以上代码中的
printf("\n 请输入一个正确的二进制数:");
scanf("%d",&a);
printf("\n%d十进制为:",a);
三行去掉 直接a=0000111;这样就会出错, 实际应用中的a恰恰是赋值的不是输入的,请问高手上面的程序该怎么改
UserYuH 发表于 2009-10-15 13:11
a=0000111;你这个赋值是八进字,十进字是73,就不是二进字形式的十进字,结果当然不对。
使用整型a容易越出范围,如输入6个1,结果也错(除非你用的编译器int是4字节),最好用长整型。
mrwtc 发表于 2009-10-15 13:17
UserYuH 你好 改了 还是错啊
UserYuH 发表于 2009-10-15 13:20
你怎么改了,放来看看,对的你程序,a=00000111不能这个赋值,但可以这样:a=111
mrwtc 发表于 2009-10-15 13:25
我也知道啊 如果是a=111的话就正常了 可是实际应用中我收到的a是十六位的二进制数 就是说 不能保证最高位是1 有可能是0000 1111 0000 1111 也可能是1111 0000 1111 0000 我该怎么将这种十六位二进制数转化为十进制数呢
UserYuH 发表于 2009-10-15 13:27
可以用数组,就能保存前面的0,
mrwtc 发表于 2009-10-15 13:30
考虑过用数组 可是因为 数据时一位一位收过来的 ch=ch<<1 这样ch就是一串数 而不是数组 我不知道怎么用数组表示ch
UserYuH 发表于 2009-10-15 13:40
数组的:
#include"math.h"
main()
{
int i,j,k=-1,y=0;
char a[16];
printf("\n 请输入一个正确的二进制数:");
for(j=0;j<16;j++)
scanf("%c",&a[j]);
printf("\n%s十进制为:",a);
for(j=15;j>=0;j--)
{
i=a[j]-'0';
k++;
y+=i*pow(2,k);
}
printf("%d\n",y);
}
如输入:0000000000000111 (是16位)
显示:0000000000000111 十进制为:7
王重平 发表于 2009-10-15 13:50
[em01]你好 还行谢谢
mrwtc 发表于 2009-10-15 13:52
UserYuH 太谢谢你了 还麻烦你写了一个程序 可是 还是有问题
问题是 如开始所说 我不能再程序中用 printf 和 scanf 因为 我的数据不是用键盘输入的 而是通过I/O口接收的 大概就如同下面这段程序
for(i = 0; i < 16; i ++)
{
one_data = one_data << 1;
SCLK = 0;
_nop_();
SCLK = 1;
_nop_(); /////时钟上升沿接收数据
if(MISO = 1) ////MISO为接收端口
{
one_data = one_data | 0x01;
}
}
这样接收-》移位-》接收——》移位 得到十六位二进制数
你知道该怎么修改程序吗???
UserYuH 发表于 2009-10-15 14:23
不是很明白,美女。
mrwtc 发表于 2009-10-15 14:29
UserYuH [em04][em04] 我的意思是 直接给a赋值 a=0000 1111 0000 1111 而不是通过scanf 给a 赋值
mrwtc 发表于 2009-10-15 15:10
UserYuH 看来你也是。。。。。。。
UserYuH 发表于 2009-10-15 15:11
嗯,慢慢解决你。
int a=3855; 二进字表示为:0000 1111 0000 1111
这样赋值可以吗,可以的话你是想位移来求十进字吗,那直接输出就是十进字了,这没意义呀。
·
不可以的话,你怎么把a赋成0000 1111 0000 1111 ,要是这串是十进字的,就因该a=111100001111,前面不能带0,但这样也超出整形范围。
UserYuH 发表于 2009-10-15 15:14
回复 13楼 mrwtc
[em03],我就是..............
yl118 发表于 2009-10-15 16:26
都是美女[em07] 我知道了!
下面这段代码是二进制转换为十进制的计算,通过输入二进制,输出十进制数。运行无误。请大家先看代码,问题在下面
#include"math.h"
main()
{
int a,i,k=-1,y=0;
printf("\n 请输入一个正确的二进制数:");
scanf("%d",&a);
printf("\n%d十进制为:",a);
while(a!=0)
{
i=a%10;
k++;
y+=i*pow(2,k);
a=a/10;
}
printf("%d\n",y);
}
问题是 如果将以上代码中的
printf("\n 请输入一个正确的二进制数:");
scanf("%d",&a);
printf("\n%d十进制为:",a);
三行去掉 直接a=0000111;这样就会出错, 实际应用中的a恰恰是赋值的不是输入的,请问高手上面的程序该怎么改
UserYuH 发表于 2009-10-15 13:11
a=0000111;你这个赋值是八进字,十进字是73,就不是二进字形式的十进字,结果当然不对。
使用整型a容易越出范围,如输入6个1,结果也错(除非你用的编译器int是4字节),最好用长整型。
mrwtc 发表于 2009-10-15 13:17
UserYuH 你好 改了 还是错啊
UserYuH 发表于 2009-10-15 13:20
你怎么改了,放来看看,对的你程序,a=00000111不能这个赋值,但可以这样:a=111
mrwtc 发表于 2009-10-15 13:25
我也知道啊 如果是a=111的话就正常了 可是实际应用中我收到的a是十六位的二进制数 就是说 不能保证最高位是1 有可能是0000 1111 0000 1111 也可能是1111 0000 1111 0000 我该怎么将这种十六位二进制数转化为十进制数呢
UserYuH 发表于 2009-10-15 13:27
可以用数组,就能保存前面的0,
mrwtc 发表于 2009-10-15 13:30
考虑过用数组 可是因为 数据时一位一位收过来的 ch=ch<<1 这样ch就是一串数 而不是数组 我不知道怎么用数组表示ch
UserYuH 发表于 2009-10-15 13:40
数组的:
#include"math.h"
main()
{
int i,j,k=-1,y=0;
char a[16];
printf("\n 请输入一个正确的二进制数:");
for(j=0;j<16;j++)
scanf("%c",&a[j]);
printf("\n%s十进制为:",a);
for(j=15;j>=0;j--)
{
i=a[j]-'0';
k++;
y+=i*pow(2,k);
}
printf("%d\n",y);
}
如输入:0000000000000111 (是16位)
显示:0000000000000111 十进制为:7
王重平 发表于 2009-10-15 13:50
[em01]你好 还行谢谢
mrwtc 发表于 2009-10-15 13:52
UserYuH 太谢谢你了 还麻烦你写了一个程序 可是 还是有问题
问题是 如开始所说 我不能再程序中用 printf 和 scanf 因为 我的数据不是用键盘输入的 而是通过I/O口接收的 大概就如同下面这段程序
for(i = 0; i < 16; i ++)
{
one_data = one_data << 1;
SCLK = 0;
_nop_();
SCLK = 1;
_nop_(); /////时钟上升沿接收数据
if(MISO = 1) ////MISO为接收端口
{
one_data = one_data | 0x01;
}
}
这样接收-》移位-》接收——》移位 得到十六位二进制数
你知道该怎么修改程序吗???
UserYuH 发表于 2009-10-15 14:23
不是很明白,美女。
mrwtc 发表于 2009-10-15 14:29
UserYuH [em04][em04] 我的意思是 直接给a赋值 a=0000 1111 0000 1111 而不是通过scanf 给a 赋值
mrwtc 发表于 2009-10-15 15:10
UserYuH 看来你也是。。。。。。。
UserYuH 发表于 2009-10-15 15:11
嗯,慢慢解决你。
int a=3855; 二进字表示为:0000 1111 0000 1111
这样赋值可以吗,可以的话你是想位移来求十进字吗,那直接输出就是十进字了,这没意义呀。
·
不可以的话,你怎么把a赋成0000 1111 0000 1111 ,要是这串是十进字的,就因该a=111100001111,前面不能带0,但这样也超出整形范围。
UserYuH 发表于 2009-10-15 15:14
回复 13楼 mrwtc
[em03],我就是..............
yl118 发表于 2009-10-15 16:26
都是美女[em07] 我知道了!
作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/2744/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!
评论列表