海明碼的軟件實現
#include?
<
stdio.h
>
#include? < math.h >
void ?main(? int ?argc,? char * ?argv[])
// 用1個字節代替1位海明碼
{
????unsigned? char ?a[ 16 ] = { 1 , 1 , 0 , 1 ,? 0 , 0 , 1 , 1 ,? 0 , 0 , 1 , 1 ,? 0 , 1 , 0 , 1 };???? // 存放原始編碼
????unsigned? char ?b[ 21 ];???????? // 存放編碼后的Hamming?Code
???? int ?K,?N;
????K = 16 ;
????N = 21 ;
????
???? int ?i = 1 ;
???? int ?j;
???? int ?k = 0 ;
????printf( " 編碼前:? " );
???? for (?;?i <= ?K;?i ++ )
????????printf( " %d? " ,a[i - 1 ]);
????printf( " \n " );
???? int ?tt = 1 ;
???? for (?i = 1 ?;?i <= N;?i ++ )
????{
????????b[i - 1 ] = 0 ;???? // 從左至右對12位數據清零,因為掃描編碼也是從左至右的
???????? if (?i? != ?tt)???? // 當位置i為權碼位置,即為2的N次方時
????????{
????????????j = 0 ;???? // 對i位置進行計數
????????????unsigned? char ?t = 0x1 ;
???????????? while (?j < ?N - K?)???? // 對位置i的四位進行檢測
????????????{
???????????????? if (?i? & ?t)???? // 為真時,則表示該位對校驗位有影響
????????????????{
????????????????????b[t - 1 ]? = ?(b[t - 1 ]? + ?a[k])? % 2 ;
????????????????}
????????????????j ++ ;
????????????????t <<= 1 ;
????????????}
????????????b[i - 1 ]? = ?a[k];
????????????k ++ ;
????????}
???????? else
????????{
????????????tt = tt * 2 ;
????????}
????}
????printf( " 編碼后:? " );
???? for (?i = 1 ;?i <= N;?i ++ )
????{
????????printf( " %d? " ,b[i - 1 ]);
????}
????printf( " \n " );
???? return ;
}
呵,這個算法雖然寫出來了,但是效率嚴重有問題。不過雖然想用二進制運算代替,但是發覺如果沒有單位操作的話,所實現的算法還比這個困難些。#include? < math.h >
void ?main(? int ?argc,? char * ?argv[])
// 用1個字節代替1位海明碼
{
????unsigned? char ?a[ 16 ] = { 1 , 1 , 0 , 1 ,? 0 , 0 , 1 , 1 ,? 0 , 0 , 1 , 1 ,? 0 , 1 , 0 , 1 };???? // 存放原始編碼
????unsigned? char ?b[ 21 ];???????? // 存放編碼后的Hamming?Code
???? int ?K,?N;
????K = 16 ;
????N = 21 ;
????
???? int ?i = 1 ;
???? int ?j;
???? int ?k = 0 ;
????printf( " 編碼前:? " );
???? for (?;?i <= ?K;?i ++ )
????????printf( " %d? " ,a[i - 1 ]);
????printf( " \n " );
???? int ?tt = 1 ;
???? for (?i = 1 ?;?i <= N;?i ++ )
????{
????????b[i - 1 ] = 0 ;???? // 從左至右對12位數據清零,因為掃描編碼也是從左至右的
???????? if (?i? != ?tt)???? // 當位置i為權碼位置,即為2的N次方時
????????{
????????????j = 0 ;???? // 對i位置進行計數
????????????unsigned? char ?t = 0x1 ;
???????????? while (?j < ?N - K?)???? // 對位置i的四位進行檢測
????????????{
???????????????? if (?i? & ?t)???? // 為真時,則表示該位對校驗位有影響
????????????????{
????????????????????b[t - 1 ]? = ?(b[t - 1 ]? + ?a[k])? % 2 ;
????????????????}
????????????????j ++ ;
????????????????t <<= 1 ;
????????????}
????????????b[i - 1 ]? = ?a[k];
????????????k ++ ;
????????}
???????? else
????????{
????????????tt = tt * 2 ;
????????}
????}
????printf( " 編碼后:? " );
???? for (?i = 1 ;?i <= N;?i ++ )
????{
????????printf( " %d? " ,b[i - 1 ]);
????}
????printf( " \n " );
???? return ;
}
想到了實現二進制類,在該類上實現與、或、移位等二進制,還須加上到整型和字符型的轉換操作。
哈,這還是有蠻多哦,慢慢想哦!~??