- 问题描述:
输入一个字符串,然后对每个字符进行奇校验,最后输出校验后的二进制数(如’3’,输出:10110011)。
输入描述:
输入包括一个字符串,字符串长度不超过100。
输出描述:
可能有多组测试数据,对于每组数据,
对于字符串中的每一个字符,输出按题目进行奇偶校验后的数,每个字符校验的结果占一行。
示例1
输入
复制
3
3a
输出
复制
10110011
10110011
01100001 - 关于
奇偶校验
这是两种校验方式,以奇校验为例:
一般有两种情况:一,原始流在前,校验位在后;二、校验位在前,原始流在后;
这两种情况都是只有一位校验位。
校验位的作用就是使得发送的二进制流中保证仅有奇数个1:如果原始流中有偶数个1,则校验位为1,如果原始流中有奇数个1,则校验位为0;
校验原理:如果接收方收到的二进制流中有偶数个1就说明出错了,要丢弃,但是并不能找出是哪一位出错,所以奇偶校验仅能发现错,不能更改错。
奇偶校验仅能发现奇数个错误,偶数位的错误发现不了。
#include<iostream>
#include<cstring>
#include<string>
#include<bitset>
using namespace std;
int main(){
//思路:求ASCI码,判1的个数,如果为偶数个,则校验位(根据例子可得在最高位)为1,反之为0
string str;
bitset<8> bit;//校验后的二进制数是8位,原来7位加上一位校验位,默认位全0 bitset
while(cin>>str){
int len= str.length();
for(int i=0;i<len;i++){
bit=str[i]; //将每一个字符的ASIIC码转化为二进制
if(bit.count()%2==0) //如果原始码有偶数个1
bit.set(7,1); //bitset是从第0位开始的,那就在最高位置1
cout<<bit<<endl;
}
}
}