題目1197:奇偶校驗


題目描述:

輸入一個字符串,然后對每個字符進行奇校驗,最后輸出校驗后的二進制數(如'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");
		}
	}
} 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM