海明碼的軟件實(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)有單位操作的話,所實(shí)現(xiàn)的算法還比這個(gè)困難些。
想到了實(shí)現(xiàn)二進(jìn)制類,在該類上實(shí)現(xiàn)與、或、移位等二進(jìn)制,還須加上到整型和字符型的轉(zhuǎn)換操作。
哈,這還是有蠻多哦,慢慢想哦!~??