海明码的软件实现
#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
;
}
呵,这个算法虽然写出来了,但是效率严重有问题。不过虽然想用二进制运算代替,但是发觉如果没有单位操作的话,所实现的算法还比这个困难些。
想到了实现二进制类,在该类上实现与、或、移位等二进制,还须加上到整型和字符型的转换操作。
哈,这还是有蛮多哦,慢慢想哦!~