Java编程题:奇偶校验

奇偶校验

输入一个字符串,然后对每个字符进行奇校验,最后输出校验后的二进制数(如’3’,输出:10110011)。

输入描述:
输入包括一个字符串,字符串长度不超过100。

输出描述:
可能有多组测试数据,对于每组数据,对于字符串中的每一个字符,输出按题目进行奇偶校验后的数,每个字符校验的结果占一行。

输入
3
3a
输出
10110011
10110011
01100001

解析:
这里将数字和字母统一看成是char类型(字符)的,所以数字3实际存储时为ASCII码中的‘3’,其十进制表示是51,转化为二进制表示就是0110011,取最高位为奇校验位,校验位为1,所以校验后的二进制数为10110011,字母同理。首先将每个字符都转换为7位二进制表示,第八位为保留的奇校验位,若7位二进制中1的个数为奇数,则奇校验位为0,若个数为偶数,则奇校验位为1.

import java.util.Scanner;
public class Main{
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while(in.hasNext()){
            String str = in.nextLine();
            jiQiaoYan(str.toCharArray());//将输入的字符串统一转换为字符数组
        }
    }
    public static void jiQiaoYan(char[] s){
        int[] result = new int[8];
        for(int i = 0; i < s.length; i++){
            int n = 0x01;//0000 0001
            int j = 7;
            int sum = 0;
             //需要进行7次与运算,得出1的个数及二进制形式
            while(j > 0){
                result[j] = (s[i] & n) == 0 ? 0 : 1; //与运算
                if(result[j] == 1){
					sum++; //个数
				} 
                n = n << 1;
                j--;
            }
            
            if((sum & 1) == 0){
            	result[0] = 1; //进行校验
            } 
            for(int k = 0; k < result.length; k++){
                System.out.print(result[k]);
            }
            result[0] = 0;
            System.out.println();
        }
    }
}

result[j] = (s[i] & n) == 0 ? 0 : 1; 注意这里只能验证 s[i] & n) == 0而不能用来验证 s[i] & n) == 1

n = n << 1;注意这里的移位,每左移一位,右边进行补零,
Java编程题:奇偶校验_第1张图片
注意:

  • 标准ASCII码是用一个字节的(7)位二进制表示一个字符(每个字节的最高位都是0)
  • if((sum&1)==0)像这种与运算要加括号哦。
  • 奇偶校验(Parity Check) 是一种校验代码传输正确性的方法。根据被传输的一组二进制代码的数位中“1”的个数是奇数或偶数来进行校验。采用奇数的称为奇校验,反之,称为偶校验。采用何种校验是事先规定好的。通常专门设置一个奇偶校验位,用它使这组代码中“1”的个数为奇数或偶数。若用奇校验,则当接收端收到这组代码时,校验“1”的个数是否为奇数,从而确定传输代码的正确性。

来源:牛客网

你可能感兴趣的:(java编程题)