海明碼的軟件實(shí)現(xiàn)
#include?
<
stdio.h
>
#include? < math.h >
void ?main(? int ?argc,? char * ?argv[])
// 用1個(gè)字節(jié)代替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 ;???? // 從左至右對(duì)12位數(shù)據(jù)清零,因?yàn)閽呙杈幋a也是從左至右的
???????? if (?i? != ?tt)???? // 當(dāng)位置i為權(quán)碼位置,即為2的N次方時(shí)
????????{
????????????j = 0 ;???? // 對(duì)i位置進(jìn)行計(jì)數(shù)
????????????unsigned? char ?t = 0x1 ;
???????????? while (?j < ?N - K?)???? // 對(duì)位置i的四位進(jìn)行檢測(cè)
????????????{
???????????????? if (?i? & ?t)???? // 為真時(shí),則表示該位對(duì)校驗(yàn)位有影響
????????????????{
????????????????????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 ;
}
呵,這個(gè)算法雖然寫(xiě)出來(lái)了,但是效率嚴(yán)重有問(wèn)題。不過(guò)雖然想用二進(jìn)制運(yùn)算代替,但是發(fā)覺(jué)如果沒(méi)有單位操作的話(huà),所實(shí)現(xiàn)的算法還比這個(gè)困難些。#include? < math.h >
void ?main(? int ?argc,? char * ?argv[])
// 用1個(gè)字節(jié)代替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 ;???? // 從左至右對(duì)12位數(shù)據(jù)清零,因?yàn)閽呙杈幋a也是從左至右的
???????? if (?i? != ?tt)???? // 當(dāng)位置i為權(quán)碼位置,即為2的N次方時(shí)
????????{
????????????j = 0 ;???? // 對(duì)i位置進(jìn)行計(jì)數(shù)
????????????unsigned? char ?t = 0x1 ;
???????????? while (?j < ?N - K?)???? // 對(duì)位置i的四位進(jìn)行檢測(cè)
????????????{
???????????????? if (?i? & ?t)???? // 為真時(shí),則表示該位對(duì)校驗(yàn)位有影響
????????????????{
????????????????????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 ;
}
想到了實(shí)現(xiàn)二進(jìn)制類(lèi),在該類(lèi)上實(shí)現(xiàn)與、或、移位等二進(jìn)制,還須加上到整型和字符型的轉(zhuǎn)換操作。
哈,這還是有蠻多哦,慢慢想哦!~??

