免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345下一页
最近访问板块 发新帖
查看: 12934 | 回复: 47
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-05-02 08:21 |只看该作者 |倒序浏览
请教:如何将一整数数组中的数据后n个位连成一串?

现假设整数数组的数据如下,取整数的后11位,同时,为书写方便,省略了整数的前16个高位:
data[0]=0000 0111 0001 1010
data[1]=0000 0101 1010 0011
data[2]=0000 0110 1100 0111
......
data[n]=**** **** **** ***

则要求连接后的形串为(方括号在实际串中没有):
[111 0001 1010] [101 1010 0011] [110 1100 0111] ......    ......
第一个的后11位    第二个的后11位    第三个的后11位   ......  第n个的后11位


上述功能是与下面代码相反的:
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;
      }

可以根据上面代码写出相反代码,也可以写一单独函数,函数定义如下:
void catbit(unsigned char *data,int *array,int n_array,int n_bits)
{......
.......
}
其中data用来存放连接起来的串,array为整形数组,n_array为整形树组内数的个数,n_bits为取整数的后bit位。


兄弟们给点帮助吧,这个地方已经耽误很多天了,一直没朋友写出相应的反函数或反代码。

[ 本帖最后由 titansword2000 于 2008-5-14 19:31 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-05-02 11:56 |只看该作者
用位移吧

论坛徽章:
0
3 [报告]
发表于 2008-05-02 12:56 |只看该作者
肯定得用位移,问题是怎么移?我想定义函数的原型如下:
void catbit(unsigned char *data,int *array,int n_array,int n_bits)
{......
.......
}

其中data用来存放连接起来的串,array为整形数组,n_array为整形树组内数的个数,n_bits为取整数的后bit位。

论坛徽章:
0
4 [报告]
发表于 2008-05-02 13:11 |只看该作者
这么移位会不会改变类型的?
unsigned long long 昨天给一个这样的类型搞到死~

论坛徽章:
0
5 [报告]
发表于 2008-05-02 13:21 |只看该作者
我最终的数据是存放在data中,它是无符号字符类型,只要有它的首地址就可以把它的数据按规定再提取出来,

论坛徽章:
0
6 [报告]
发表于 2008-05-03 07:08 |只看该作者
看的人不少,回的朋友不多,继续等待中

论坛徽章:
0
7 [报告]
发表于 2008-05-03 20:11 |只看该作者
目前我没想到什么合适的方法,请大家在说明方法的同时最好能写出象下面这样的一个函数:
void catbit(unsigned char *data,int *array,int n_array,int n_bits)
{......
.......
}

其中data用来存放连接起来的串,array为整形数组,n_array为整形树组内数的个数,n_bits为取整数的后bit位。

论坛徽章:
0
8 [报告]
发表于 2008-05-04 09:02 |只看该作者
问题还没解决,得顶起来。

论坛徽章:
0
9 [报告]
发表于 2008-05-04 11:30 |只看该作者

这个样子行不?自己测试一下

void catbit(unsigned char *data,int *array,int n_array,int n_bits)
{
     int start= 0;
     int point = 0;
     int tmp = 0;
     int c  = 0,i=0;
     char lost =0 ;
     char c_tmp = 0;
     char *p,*p1;
     int len = (int)n_bits/8;
         int len1 = 0;

      c = n_bits%8;
      if( c > 0 )
             len++;
      p = data;
      for(i=0; i< n_array; i++)
      {
                 tmp = array;
                 tmp <<= 32-(n_bits+start);
                 p1 = (char *)&tmp;
                 if(c != 0)
                 {
                         c_tmp = 0xff;
                        c_tmp >>= start;
                        *p1 = (*p1) & c_tmp;     //clear
                        *p1 = *p1 & lost;        // load lost to frist Byte
                        start += (8-c);       
                        if( start >= 8 )
                                len1 = len + 1;
                        else
                                len1 = len;
                        start = start%8;                                             
                }
                 memcpy(p, &tmp, len1);
                 p1 += len1;
                 lost = *p1;
                 p += len1;
    }
}

论坛徽章:
0
10 [报告]
发表于 2008-05-04 12:26 |只看该作者
原帖由 titansword2000 于 2008-5-2 08:21 发表
请教:如何将一整数数组中的数据后n个位连成一串?

现假设整数数组的数据如下,取整数的后11位,同时,为书写方便,省略了整数的前16个高位:
data[0]=0000 0111 0001 1010
data[1]=0000 0101 1010 0011
...


什么反函数?听得稀里糊涂


  1. void catbit(unsigned char *data,int *array,int n_array,int n_bits)
  2. {
  3.     memset(data, '0', strlen(data));
  4.     int i = 1;
  5.     for(int j = n_bits-1 ; j >= 0; --j) {
  6.         for(int k = 0; k < n_array; ++k) {
  7.             if(array[k] & i) {
  8.                 data[n_bits*k+j] = '1';
  9.             }
  10.         }
  11.         i <<= 1;
  12.     }
  13. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP