海明碼的軟件實現
#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
;
}
呵,這個算法雖然寫出來了,但是效率嚴重有問題。不過雖然想用二進制運算代替,但是發覺如果沒有單位操作的話,所實現的算法還比這個困難些。
想到了實現二進制類,在該類上實現與、或、移位等二進制,還須加上到整型和字符型的轉換操作。
哈,這還是有蠻多哦,慢慢想哦!~??