免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: titansword2000
打印 上一主题 下一主题

[C] 位操作高手请进。已解决,感谢兄弟们的帮助! [复制链接]

论坛徽章:
0
11 [报告]
发表于 2008-05-06 16:44 |显示全部楼层
To:醉卧水云间
高手就是高手,不一样,竟是神速,3分钟就给搞出来了,佩服!
兄弟,有没有兴趣帮我把贴在19楼的代码写个反函数?我大的那个函数BDS_unpack()是解码过程,现在要再写个编码函数BDS_pack()。先谢了!

论坛徽章:
0
12 [报告]
发表于 2008-05-06 18:05 |显示全部楼层
我一般潜水,才165刀,远远不够啊,够的话肯定给兄弟,要不我把这些全给你,别嫌少啊

论坛徽章:
0
13 [报告]
发表于 2008-05-09 16:39 |显示全部楼层
经验证,“醉卧水云间”兄弟在27楼发的函数代码仍有错误。经编码后再解码,发现数据明显不对,故可判定该函数代码仍然存在问题。

论坛徽章:
0
14 [报告]
发表于 2008-05-09 19:34 |显示全部楼层
同时,我认为在if(bit)前加个if(bitpos%8 == 0) data[byte]=0x00;的语句以清空data[byte]中的数据。不知对否?

论坛徽章:
0
15 [报告]
发表于 2008-05-10 11:10 |显示全部楼层
回34楼,将其该为offset=7-(bitpos%之后,经解码后验证,发现其还是不对。从你的代码来看,应该是对的。问题能出在哪儿呢

论坛徽章:
0
16 [报告]
发表于 2008-05-10 16:09 |显示全部楼层
解码函数不是我写的,但经过验证是没有问题的。
具体的解码函数如下:

static unsigned int mask[] = {0,1,3,7,15,31,63,127,255};
static unsigned int map_masks[8] = {128, 64, 32, 16, 8, 4, 2, 1};
static double shift[9] = {1.0, 2.0, 4.0, 8.0, 16.0, 32.0, 64.0, 128.0, 256.0};

void BDS_unpack(float *flt,unsigned char *bds,unsigned char *bitmap,
                                int n_bits,int n,double ref,double scale)
{unsigned char *bits;

int i,mask_idx,t_bits,c_bits,j_bits;
unsigned int j, map_mask, tbits, jmask, bbits;
double jj;


if(BDS_Harmonic(bds))
   {bits = bds + 15;
     /* fill in global mean */
     *flt++ = BDS_Harmonic_RefValue(bds);
     n -= 1;
    }
else
     bits = bds + 11;  

tbits=bbits=0;

jmask = (1 << n_bits) - 1;
t_bits = 0;


///////////////   开始解码
  for(i=0;i<n;i++)
        {while(t_bits < n_bits)
            {tbits = (tbits * 256) + *bits++;
             t_bits += 8;
            }
         t_bits -= n_bits;
         flt = (tbits >> t_bits) & jmask;
        }
      /* at least this vectorizes */
      for(i=0;i<n;i++)
         flt = ref + scale*flt;
///////////////   结束解码


}

论坛徽章:
0
17 [报告]
发表于 2008-05-10 16:38 |显示全部楼层
我也觉得你的编码函数是对的。你看我发的那个解码函数不就是我说的那个意思,把后面的n_bits位连成一串吗?

论坛徽章:
0
18 [报告]
发表于 2008-05-14 19:29 |显示全部楼层
经过几天的不断测试,发现醉卧水云间网友思路和代码是正确的,现将代码贴到下面:(仅仅修改了醉卧水云间网友的部分代码,感谢醉卧水云间对本人的支持)


void setbitpos(unsigned char *data, int bitpos, int bit)
{
    int byte=(bitpos)/8;
    int offset=7-(bitpos%8 );
    if(bitpos % 8 == 0)
        data[byte]=0x00;    //清空该内存地址中有可能存在的数据

    if(bit)
    {
        data[byte]|= (1<<offset);
    }
    else
    {
        data[byte]&= ~(1<<offset);
    }
}

void catbit(unsigned char *data,int *array,int n_array,int n_bits)
{
    unsigned int bitpos=0;

    for(int i=0;i<n_array;i++)
    {
        for(int j=n_bits-1;j>=0;j--)
        {
            int bit= array & (1 << j);

            setbitpos(data, bitpos++, bit);
        }
    }
}

[ 本帖最后由 titansword2000 于 2008-5-14 19:30 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP