TanZek's 技术空间

勇往直前,专注于技术...

首页 新随笔 联系 聚合 管理
  7 Posts :: 19 Stories :: 13 Comments :: 0 Trackbacks

海明码的软件实现

#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 ;
}
呵,这个算法虽然写出来了,但是效率严重有问题。不过虽然想用二进制运算代替,但是发觉如果没有单位操作的话,所实现的算法还比这个困难些。
想到了实现二进制类,在该类上实现与、或、移位等二进制,还须加上到整型和字符型的转换操作。
哈,这还是有蛮多哦,慢慢想哦!~  
posted on 2006-10-14 16:46 TanZek 阅读(1488) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理