输入一个字符串,然后对每个字符进行奇校验,最后输出校验后的二进制数(如’3’,输出:10110011)。
输入描述:
输入包括一个字符串,字符串长度不超过100。
输出描述:
可能有多组测试数据,对于每组数据,
对于字符串中的每一个字符,输出按题目进行奇偶校验后的数,每个字符校验的结果占一行。
输入:
3
3a
输出:
10110011
10110011
01100001
题目解析:
我们可以知道在网络数据的传输中可能会出现很多的问题,为了防止我们接收到错误的数据进行一些错误的操作,在接收到数据时,我们往往会有一系列的校验工作,而“奇偶校验”就是最简单的错误检测码。
奇偶校验有两种类型:奇校验、偶校验。
如果一组给定数据位中 1 的个数是奇数,那么偶校验位就置为 1,从而使得总的 1 的个数是偶数;
在这里我们将以奇校验为例,偶校验类比于奇校验。
奇校验: 如果给定一组数据位中 1 的个数是偶数,那么奇校验位就置为 1,使得总的 1 的个数保持奇数不变。
举例解释:
数据(1的个数) | 奇校验 |
---|---|
0000 0011(2) | 0000 0011 1 |
0000 0100(1) | 0000 0100 0 |
0111 1111(7) | 0111 1111 0 |
因为是奇校验,所以当二进制数中1的个数为偶数个时,需要添加1来将二进制中1的个数补为奇数个;当二进制数中1的个数为奇数个时,就不需要做任何操作。
在我们知道了奇校验之后,我们不知道应该把校验位加在哪里,这就需要我们审题目了。本道题中时对于每个字符进行操作,我们会通过举例发现
-
3
的奇校验输出为10110011
-
a
的奇校验输出为01100001
-
字符
3
的ASCII码的十进制为:51,转化为二进制数0011 0011
-
字符
a
的ASCII码的十进制为:97,转化为的二进制数0110 0001
ASCII码使用7位二进制数(剩下的1位二进制为0)来表示所有的大写和小写字母,数字0 到9、标点符号。
总结来看,该处的字符按照ACSII码对应的十进制数转化为二进制进行奇校验,最高位奇校验校验位。
代码
/*
1. 将输入的字符串转化为字符数组。对字符数组中的每一个字符进行校验。
2. 对于每个字符的校验
a. 取得其二进制序列
b. 计算其二进制中1的个数
c. 1的个数为奇数个,高位设置为0;1的个数为偶数个,高位设置为1
*/
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
String str = sc.next();
jiCheck(str.toCharArray());
}
}
public static void jiCheck(char[] arrs){
int[] result = new int[8]; // 保存二进制序列
for(int i = 0; i < arrs.length; i++){
int one = 0x01;
int count = 0; // 保留二进制序列中1的个数
// 得到其二进制序列
int index = 7;
while(index > 0){
result[index] = ((arrs[i]& one) == 0) ? 0 : 1;
if(result[index] == 1)
count++;
one <<= 1;
index--;
}
// 偶数个1,高位为1;奇数个1,高位为0
result[0] = (count % 2 == 1) ? 0 : 1;
// 输出
for(int k = 0; k < 8; k++){
System.out.print(result[k]);
}
System.out.println();
}
}
}
本地IDEA里运行:
牛客网上在线OJ: