一、奇偶校验位类型题
1.补充知识点:
①&运算的特点
&运算,两位数(可以是整型,也可以是字符型等)做&运算的时候,会自动转化为二进制的形式(注意各种按位运算符都是这样的),int 型为8位,char型也是8位,long 型为16位,然后一位一位相比,相同位的则为1,不相同的则为0
②&运算的作用
<1> 比对两数的位数相同
<2> 最高位添加0校验位
比如:定义一个变量c,然后想在c二进制形式的最高位补个0,那么直接就可以c=c&1,然后输出c,就是在c最高位补了0后的值了
<3>统计一个二进制1的个数
统计二进制中1的个数并不需要自己将该数据转为二进制例如一个数是 11001,只需要将它分别与 00001 00010 00100 01000 10000 相与,然后统计他们的和,就可以了,因为这00001 00010 00100 01000 10000 几个已经包括了11001的1存在的各个位置的情况,所以如果在对应位置上有1的话,就count++
<4>判断某一位是否为0或1
判断最低位是否是1 和00001相与后 结果是1 那么表示最低位是1,判断次低位 和00010相与后 结果是0 那么表示次低位是0
<5>如何在最高位添加1校验位
可以让这个数与10000000按位或(就是让它与比他位数多一位的数10000…按位或),相或就是两者对应的二个二进位有一个为1时,结果位就为1。
注意,100000000可以用1<<7表达,就是1左移七位
比如,c=c|(1<<7),c是一个字符型的,那么输出c的时候就是在其最高位加了1校验位的值
③如何将一个数以二进制的形式输出
用一个for循环,当为短整型和字符型的时候,循环8次,Long的时候循环16次,然后用让其和它各个不同1位置的情况进行相与运算,相同则输出1,不同则输出0.
//从高位开始输出
for(i=7;i>=0;i--){
if(c&(1<<i) )//每一位与1进行相与运算
{
printf("%d",1);
}else{
printf("%d",0);
}
}
2.例题
例1:输出一个数按奇校验后的二进制数值
①补充说明:
奇偶校验)是数据传送时采用的一种校正数据错误的一种方式分为奇校验和偶校验两种。
如果是采用奇校验,在传送每一个字节的时候另外附加一位作为校验位,校验位在数据位前面,当实际数据中“1”的个数为偶数的时候,这个校验位就是“1”,否则这个校验位就是“0”,这样就可以保证传送数据满足奇校验的要求。在接收方收到数据时,将按照奇校验的要求检测数据中“1”的个数,如果是奇数,表示传送正确,否则表示传送错误。就是1为偶数时,在最高位补1,否则补0。就是要保证1的个数为奇数个,奇校验的英文简写ODD。
同理偶校验的过程和奇校验的过程一当实际数据中“1”的个数为偶数的时候,这个校验位就是“0”,否则这个校验位就是“1”,这样就可以保证传送数据满足偶校验的要求。在接收方收到数据时,将按照偶校验的要求检测数据中“1”的个数,如果是偶数个“1”,表示传送正确,否则表示传送错误。就是当1的个数为奇数时,校验位补1,否则补0,就是要保证1的个数为偶数个
②代码:
#include<stdio.h>
#include<stdlib.h>
int main()
{
char c;
int i;
int counts;
scanf("%c",&c);
counts=0;//用于统计二进制中1的个数
//统计二进制中1的个数并不需要自己将该数据转为二进制
//例如一个数是 11001
//只需要将它分别与 00001 00010 00100 01000 10000 相与
//然后统计他们的和
//判断最低位是否是1 和00001相与后 结果是1 那么表示最低位是1
//判断次低位 和00010相与后 结果是0 那么表示次低位是0
//再次观察这些需要相与的数 他们是倍数关系
for(i=7; i>=0; i--)
{
//无需自己将c转为二进制 &符号会自动的转为二进制再与
if( c & (1<<i) ) counts++;//1<<i表示将1扩大i倍
}
printf("count%d\n",counts);
//校验位
if(counts%2){//若1奇数个
//那么奇校验最高位是0
c=c&(1);
}else{
//若1偶数个
//C语言中没有提供二进制的表示方式 因此通过 i<<?的方式来表示
c=c|(1<<7);
}
//输出
//输出时注意顺序 从高位开始输出
for(i=7;i>=0;i--){
if(c&(1<<i) ){
printf("%d",1);
}else{
printf("%d",0);
}
}
}
例2:
①代码
#include <iostream>
#include <istream>
using namespace std;
int main()
{
char a[1001];
int count=0;
cin.getline(a,1001);
int i=0;
while(a[i])
{
for(int j=0;j<=7;j++)//从低位开始一位一位的判断
{
if(a[j]&(1<<j))
{
count++;
}
}
i++;
}
if(count&2==0)
{
cout<<1;
}
else cout<<0;
}