- 题目描述:
-
输入一个字符串,然后对每个字符进行奇校验,最后输出校验后的二进制数(如‘3’,输出:10110011)。
- 输入:
-
输入包括一个字符串,字符串长度不超过100。
- 输出:
-
可能有多组测试数据,对于每组数据,
对于字符串中的每一个字符,输出按题目进行奇偶校验后的数,每个字符校验的结果占一行。
- 样例输入:
-
3 3a
- 样例输出:
-
10110011 10110011 01100001
- 解题思路
- 刚开始奇偶校验不知道是什么意思,下面简单说一下。
- 信息是以比特流的方式传输的,类似01000001。在传输过程中,有可能会发生错误,比如,我们存储了01000001,但是取出来却是01000000,即低位由0变成了1。为了检测到这种错误,我们可以通过“奇偶校验”来实现。假如,我们存储的数据是一个字节,8个比特位,那我们就可以计算每个字节比特位是1的个数,如果是偶数个1,那么,我们就把第九个位设为1,如果是奇数个1,那么就把第九个位设为0,这样连续9个字节比特位为1的位数肯定是奇数。这中方法叫做“奇校验”,“偶校验”和此类似。当然,在实际应用中,也可以把一个字节的前7位作为数据位,最后一个为作为校验位。
- 比如说对字符‘3’进行奇偶校验。‘3‘的ascii值为51,51对应二进制为 0110011(用七位表示) 其中1的个数为4(偶数)个。所以在最高为添1 所以‘3‘的奇校验为10110011
- 另外注意一下十进制转二进制 循环的写法 有些博客上是用位操作 &来做的 比如 http://blog.csdn.net/wconvey/article/details/8510943
- 刚开始总是WA 找了很久发现 原来是数组开小了 我开的100 这样的话会溢出 所以直接报错 改成105就好了
-
#include<stdio.h> #include<iostream> #include<string.h> using namespace std; int judge[9]; int sum; void toBinary(char c){//字符c ascii值 十进制转 二进制函数 sum=0; int x; for(int i=0;i<8;i++) judge[i]=0; x=c; // cout<<x<<endl; int i=7; int newx; do{ newx=x/2; int t=x%2; judge[i--]=t; if(t==1) sum++; x=newx; }while(newx!=0); } int main(){ char a[105]; while(cin.getline(a,105)){ for(int i=0;i<strlen(a);i++){ char ch=a[i]; if(ch==‘\0‘) break; //ch是当前字符 toBinary(ch); // cout<<"sum="<<sum<<endl; if(sum%2==1) judge[0]=0; else judge[0]=1; for(int i=0;i<8;i++) printf("%d",judge[i]); printf("\n"); } } }
时间: 2024-11-09 00:31:22