免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
31 [报告]
发表于 2008-05-07 19:30 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

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

论坛徽章:
38
2017金鸡报晓
日期:2017-02-08 10:39:4215-16赛季CBA联赛之深圳
日期:2023-02-16 14:39:0220周年集字徽章-年
日期:2022-08-31 14:25:28黑曼巴
日期:2022-08-17 18:57:0919周年集字徽章-年
日期:2022-04-25 13:02:5920周年集字徽章-20	
日期:2022-03-29 11:10:4620周年集字徽章-年
日期:2022-03-14 22:35:1820周年集字徽章-周	
日期:2022-03-09 12:51:3220周年集字徽章-年
日期:2022-02-10 13:13:4420周年集字徽章-周	
日期:2022-02-03 12:09:4420周年集字徽章-20	
日期:2022-01-25 20:14:2720周年集字徽章-周	
日期:2022-01-13 15:12:33
33 [报告]
发表于 2008-05-09 16:59 |只看该作者
int offset= bitpos%8
改成
int offset=7-(bitpos%;

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

论坛徽章:
0
35 [报告]
发表于 2008-05-09 23:33 |只看该作者
最近也在做一个工具,其中涉及到文件的位级保存,下面的几行操作实现起来不那么繁杂(c++, 阿弥陀佛!若有限制,则无视,另外非常佩服前几位的钻研精神和热情,值得学习!):

-------------------------------------
CString res;

for(i=0;i<n;i++)
{
    pbinarychar = Convert2binarychar(data);        // 返回值以'\0'结尾,只需完善这一模块
    CString strtmp = CString(pbinarychar);

    res += strtmp.Right(11);                                // 主要是利用了CString的这点操作的便利
}

return res;
————————————————————
其中的
char* Convert2binarychar( datatype );
模块返回一个由0和1组成的字符串,要不了几行代码。
而且你要是8字节的数据类型的话,完全可以直接忽略高48位,可以有比较大的简便。

[ 本帖最后由 以泪洗面 于 2008-5-9 23:42 编辑 ]

论坛徽章:
0
36 [报告]
发表于 2008-05-10 04:43 |只看该作者
#include <stdlib.h>
#include <stdio.h>
#include <time.h>

extern const int True  =  0;
extern const int False   =  1;
extern const void* null  = 0;

int CombineBits(unsigned char *& result, int * array, int size, int nbits);
int* CreateRandArray(int n, int max);

int _tmain(int argc, _TCHAR* argv[])
{
   int*  pArray;
   int   size;
   unsigned char*    pData;
   int   retCode;
   int   temp, i, j;
   int   nbits = 11;

   srand((unsigned)time(NULL));
   size = abs(rand()) % 50 + 1;
   pArray = CreateRandArray(size, 1 << 16);


   if ( pArray == 0 ) {
      printf("Create random array failed!\n");
      return False;
   }

   retCode = CombineBits(pData, pArray, size, nbits);
   if ( retCode == 0 ) {
      printf("CombineBits failed!\n");
      free(pArray);
      pArray = 0;
      return False;
   }

   unsigned char* pStr1   = (unsigned char*)malloc(retCode * 8 + 1);
   unsigned char* pStr2   = (unsigned char*)malloc(retCode * 8 + 1);
   memset(pStr1, '0', retCode * 8);
   memset(pStr2, '0', retCode * 8);
   pStr1[retCode * 8] = pStr2[retCode * 8] = 0;

   for ( i = 0; i < size; ++i ) {
      temp = pArray[i] << (32 - nbits);
      for ( j = 0; j < nbits; ++j ) {
         pStr1[i * nbits + j] = temp & (1 << 31) ? '1' : '0';
         temp <<= 1;
      }
   }

   for ( i = 0; i < retCode; ++i ) {
      for ( j = 0; j < 8; ++j ) {
         pStr2[i * 8 + j] = pData[i] & (1 << (7 - j)) ? '1' : '0';
      }
   }

   printf("\n%s\n", pStr1);
   printf("---------------------------------------------------------\n");
   printf("%s\n", pStr2);
   retCode = strcmp((char*)pStr1, (char*)pStr2);
   printf("result = %d\n", retCode);
   
}

int CombineBits(unsigned char *& result, int * array, int size, int nbits) {
   if ( size < 1 || nbits < 1 || nbits > 31 ) {
      return False;
   }

   int   len = 0;
   // calculate require number of bytes to store the result

   len = (size * nbits) / 8 + 1;
   result = (unsigned char*)malloc(len);
   memset(result, 0, len);


   int major;           // current byte we are filling

   int minor;           // filling position at current

   int leftbits;        // left bits in current integer


   major = 0; minor = 0;
   unsigned int num = 0;
   for ( int i = 0; i < size; ++i ) {
      num = array[i];
      // set all high bits to 0

      num <<= (32 - nbits);
      num >>= (32 - nbits);

      leftbits = nbits;
      while ( leftbits > 0 ) {
         if ( leftbits > (8 - minor) ) {
            // left bits of current int are more than left bits of current char

            result[major] |= (num >> (leftbits - (8 - minor)));
            major++;
            
            leftbits -= (8 - minor);
            minor = 0;
            num <<= (32 - leftbits);
            num >>= (32 - leftbits);
         }
         else {
            result[major] |= (num << ((8 - minor) - leftbits));
            minor += leftbits;
            leftbits = 0;
         }
      }

   }
   return len;
}

int* CreateRandArray(int n, int max) {
   if ( n < 1 ) {
      return 0;
   }
   srand((unsigned)time(NULL));
   int*  pArray = (int*)malloc(n * sizeof(int));
   for ( int i = 0; i < n; ++i ) {

      pArray[i] = abs(rand()) % max;
   }

   return pArray;
}

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

论坛徽章:
0
38 [报告]
发表于 2008-05-10 13:12 |只看该作者
你确定你的解码程序没问题?

换句话说,你确定你正确理解了那段解码程序的算法?

论坛徽章:
0
39 [报告]
发表于 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;
///////////////   结束解码


}

论坛徽章:
38
2017金鸡报晓
日期:2017-02-08 10:39:4215-16赛季CBA联赛之深圳
日期:2023-02-16 14:39:0220周年集字徽章-年
日期:2022-08-31 14:25:28黑曼巴
日期:2022-08-17 18:57:0919周年集字徽章-年
日期:2022-04-25 13:02:5920周年集字徽章-20	
日期:2022-03-29 11:10:4620周年集字徽章-年
日期:2022-03-14 22:35:1820周年集字徽章-周	
日期:2022-03-09 12:51:3220周年集字徽章-年
日期:2022-02-10 13:13:4420周年集字徽章-周	
日期:2022-02-03 12:09:4420周年集字徽章-20	
日期:2022-01-25 20:14:2720周年集字徽章-周	
日期:2022-01-13 15:12:33
40 [报告]
发表于 2008-05-10 16:28 |只看该作者
原帖由 titansword2000 于 2008-5-10 11:10 发表
回34楼,将其该为offset=7-(bitpos%之后,经解码后验证,发现其还是不对。从你的代码来看,应该是对的。问题能出在哪儿呢


我的代码是对的, 解码自己琢磨, 看来这个问题够你玩一阵了, 你慢慢玩啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP