C语言,如何把输入的一个字符串,转换为相应的二进制数?

C语言,如何把输入的一个字符串,转换为相应的二进制数?,第1张

#include <stdioh>
int main()
{
    char str[100];
    int i,n=0;
    scanf("%s",str);
    for(i=0;str[i]!='\0';i++)
    {
        if(str[i]=='1' || str[i]=='0')
        {
            n<<=1;
            n+=str[i]-'0';
        }
        else
        {
            printf("不是二进制数\n");
            return 1;
        }
    }
    printf("%d\n",n);
}

数字的存储在计算机分为整数和浮点数存储,整数的话都是以二进制补码的形式存储,正数的补码是正数原码本身,负数的补码是原码的反码加1,而浮点数的存储就更为复杂了,包含符号位、基数位、阶码,以“符号位+基数+阶码”的形式存放(当然这只是个简单的模型,只是为了说明问题,基数本身是以补码的形式存放,而阶码就特殊点了,可以参看>

英文字符都是以ASCII码的形式存放,这是早期电脑中的数据存储形式,就是用1B(8位)来存放一个英文字符对应的ASCII码,最高位为0,但是现在的 *** 作系统中都是Unicode编码,即用2B来存放一个英文字符,高8位全为0,低8位为对应英文字符的ASCII编码而汉字的编码也差不多,只不过一个汉字固定是用2B来存放的,一个汉字的编码高8位和低8位的第一个位都为1,汉字的编码有个区间按照GB2312标准的汉字范围:0xB0A1(45217)-0xF7FE(63486))

图像和声音的编码更为复杂了,因为我们知道和声音文件有很多种后缀名(图像:例如jpg/png/bmp等等声音:mp3/wma/wav等等)按照不同的后缀名会有不同的编码方式,即使是同一个后缀名也可能有多种编码方式,所以这个小点很不好回答要简单先了解一下的话,你可以先看看图像中的bmp文件是怎么编码成二进制文件的,这个主要编码方式是把图像当成一个点阵,每个点阵上有多位颜色,每一种颜色分别用一个的一定位数来编码(这个得根据颜色的多少来决定用多少位二进制数来编码,例如256色,真彩色等等),点阵的位置用一定位数来编码,对应的点阵位置上存放的就是对应颜色的编码(呵呵有点复杂)

声音的话也跟图像编码类似,就指wav声音文件来说,先把音轨按时间来划分,每隔一定的时间采样一次,隔的时间的倒数就是我们所说的采样频率而我们是对每一个采到的声音进行编码,例如按照声波的振幅进行编码,不同的振幅对应不同的二进制编码,如振幅0对应00000000,这只是简单的说明一下wav音频文件的编码。

提供个思路和算法,请自己动手实现,这样对你有好处:
1、将字符串转成整数数组储存(假设Source),共40个元素(Source[0] 到 Source[39]),每个元素中保存1位;再定义1个数组用来保存转化后的二进制数(假设为Result);
2、转化2进制的算法:开始,判断:
21 如果数组Source末位元素 Source[39] , 如果为偶数,则输出1位二进制数为 0 ,如果为奇数,则输出1位 二进制数 1;
22 从 Source 数组 首元素开始依次往后,除以2并将结果仍保存在Source数组,注意可能存在借位的情况(比如第一次循环 Source[0]=1,Source[1]=2 ,则除以2以后结果为 Source[0]=0,Source[1]= 6;)
23 循环21、23 直到Source 数组所有的元素变成0;
3、将步骤2中输出的二进制数逆序输出,即可得到转化后的二进制数。

 十进制数转换为二进制数时,由于整数和小数的转换方法不同,所以先将十进制数的整数部分和小数部分分别转换后,再加以合并。 十进制整数转换为二进制整数采用"除2取余,逆序排列"法。具体做法是:用2去除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行,直到商为0时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。 比如:255=(11111111)B 这个不 是一下就会的得勤加练习 就会做到熟能生巧。 望采纳

当然可以输出了的啊,但是在输出的时候需要进行转换的,现在提供一个十进制到任意进制的转换程序,你可以在编写程序的时候参考一下。
源程序如下:
#include<stdioh>
#include<mathh>
void main()
{
int i=0,n,j,a[20],b[20],k,c=0;
double m,x,d;
printf("请输入需要转换的数:");
scanf("%lf",&x);
printf("请输入要转换成的进制(1<N<=16):");
scanf("%d",&n);
if(x<0)
m=fabs(x);
else
m=x;
k=(int)m;//强制类型转换,可以使用k=(int)m;代替,从而更加的一目了然
while(k)//判定需要转换的数是否变为0
{
a[i++]=k%n;//取余,进行进制转换,但是顺序与正确值相反
k/=n;//转换一位之后进行相应的变化
}
if(m!=(int)m)//选择性计算,如果是整数就不用进行这一步的计算了,这样可以节约程序的运行时间
{
d=m-(int)m;//取小数部分
while(d!=0)
{
b[c]=(int)(dn);//算法为×N取整
d=dn-b[c];
c++;
if(c>=10)
break;//主要是控制小数后面万一出现无限小数的时候好跳出循环以免出现死循环
}
}
printf("转换结果为:");
if(x<0)
printf("-");
for(j=i-1;j>=0;j--)//反序输出,大于10的数字进行相应的变化
{
if(a[j]==10)
printf("A");
else
if(a[j]==11)
printf("B");
else
if(a[j]==12)
printf("C");
else
if(a[j]==13)
printf("D");
else
if(a[j]==14)
printf("E");
else
if(a[j]==15)
printf("F");
else
printf("%d",a[j]);
}
if(m!=(int)m)//选择性输出,这样可以节约输出时间和程序的运行时间
{
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");//输出换行,以使程序的输出结果美观
}
可能在程序的编写上有点臃肿的,使用函数可以简化很多的,但是最为参考就没有使用函数的啦,你在使用的过程中可以适当修改使用。祝你学的开心!

流可以分为两种类型:文本流和二进制流。文本流是解释性的,最长可达255个字符,其中回车/换行将被转换为换行符“\n”,(如果以"文本"方式打开一个文件,那么在读字符的时候,系统会把所有的"\r\n"序列转成"\n",在写入时把"\n"转成"\r\n" archim 's opinion )。二进制流是非解释性的,一次处理一个字符,并且不转换字符。
通常,文本流用来读写标准的文本文件,或者将字符输出到屏幕或打印机,或者接受键盘的输入;而二进制流用来读写二进制文件(例如图形或字处理文档),或者读取鼠标输入,或者读写调制解调器

十六进制转成十进制的函数:
//返回16进制字符串s对应的整数值,遇到任何一个非法字符都返回-1。
int HexToDec(char s)
{
char p = s;
//空串返回0。
if(p == '\0')
return 0;

//忽略开头的'0'字符
while(p == '0')
p++;
int dec = 0;
char c;
//循环直到字符串结束。
while(c = p++)
{
//dec乘16
dec <<= 4;

//数字字符。
if(c >= '0' && c <= '9')
{
dec += c - '0';
continue;
}
//小写abcdef。
if(c >= 'a' && c <= 'f')
{
dec += c - 'a' + 10;
continue;
}
//大写ABCDEF。
if(c >= 'A' && c <= 'F')
{
dec += c - 'A' + 10;
continue;
}
//没有从任何一个if语句中结束,说明遇到了非法字符。
return -1;
}
//正常结束循环,返回10进制整数值。
return dec;
}
十进制转成二进制的函数:
/递归法求二进制数/
#include<stdioh>
void printb(int x,int n);
void main()
{
int x;
printf("input number:");
scanf("%d",&x);
printf("number of decimal form: %d\n",x);

printb(x,sizeof(int)8);
putchar('\n');
}
void printb(int x,int n)
{
if(n>0)
{
putchar('0'+( (unsigned)(x & (1<<(n-1) ) )>>(n-1)));
printb(x,n-1);
}
}

Byte数据可通过一定的自定义函数过程,将其转化成二进制字符串。
可先将Byte数据其10进制值用Hex函数转为16进制的字符串,然后通过自定义函数转成二进制字符串。
Hex函数,返回代表十六进制数值的String。
在Text1中输入Byte数据的10进制值,Text2就展现其二进制字符串。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13178795.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-06-16
下一篇 2023-06-16

发表评论

登录后才能评论

评论列表(0条)

保存