关于c的位操作问题
unsigned char buf[12] = {0x23,0x34,0xf3, ...};
想从上面的数组中依次提取出n位,做为其他用途
例如: 数组中的数二进制为0010 0011,0011 0100,1111 0011,...
若n为3,则提取出的数分别为:001, 000,110,011,010,011,110,011,...
请问,有什么好的方法实现?
[解决办法]
可以把buf中的数都分解成0和1存放在一个数组中,然后按n的数值来进行存取,
好像不能直接取3位,因为c/c++中的最小操作单位是8个字节,所以我想应该要先把数字分解.
[解决办法]
如果你的n的值不确定,最好是把char中的值分解成01存在数组中
[解决办法]
送你一段程序
void getbuffbits(int nbits,unsigned char szbuffi[],int nbuffleni,unsigned char szbuffj[])
{
if(nbits > 0 && szbuffi != NULL && szbuffj != NULL && nbuffleni > 0)
{
int nbufflenj = nbuffleni * 8 / nbits;
for(int jindex = 0; jindex <nbufflenj;jindex++)
{
unsigned char nmask = 0x00;
int iindex = jindex * nbits / 8;
int ibit = jindex * nbits % 8;
if(ibit + nbits < 0x08)
{
nmask = (0x01 < < (8-ibit)) - 0x01;
szbuffj[jindex] = (szbuffi[iindex] & nmask) > > (0x08 - ibit - nbits);
}
else if(ibit + nbits == 0x08)
{
nmask = (0x01 < < (8-ibit)) - 0x01;
szbuffj[jindex] = (szbuffi[iindex] & nmask);
}
else
{
nmask = (0x01 < < (8-ibit)) - 0x01;
szbuffj[jindex] = (szbuffi[iindex] & nmask) < < (ibit + nbits - 0x08);
nmask = (0x01 < < (ibit + nbits - 0x08)) - 0x01;
szbuffj[jindex] |= (szbuffi[iindex+1] & nmask);
}
}
}
}
unsigned char buf1[12] = {0x23,0x34,0xf3};
unsigned char buf2[12] = {0};
getbuffbits(3,buf1,3,buf2);
输出buf2
001, 000,110,011,010,011,110,011,...
[解决办法]
#define size 8 //数组大小
int main()
{
unsigned char buf[size] = {0x23,0x34,0xf3,0xf1,0xa,0xb,0xa1,0xc};
int i=0,j=0;
int n=3; //取几位.
long num=0;
int count=0;
int tmp;
for(i=0;i <size;i++)
for(j=1;j <9;j++)
{
num=num < <1;
tmp=((buf[i])&(1 < <8-j))> > (8-j);
printf( "%d ",tmp);
num+=tmp;
count++;
if(count==n)
{
printf( " %x, ",num);
count=0;
num=0;
}
}
printf( "\n ");
}
[解决办法]
#include <stdio.h>
#include <stdlib.h>
#define CHARBITS 8
int fetch(unsigned char in[],int m,int n,unsigned char *out)
{
//在数组in[](in[0]到in[m-1])中依次提取n位,存入out指向的存储单元(至少m*CHARBITS/n个)序列
unsigned char *temp = (unsigned char *)malloc((m*CHARBITS)*sizeof(unsigned char));
if(temp == NULL)
{
exit(-1);
}
unsigned char a;
int i,j = 0,t = 0;
if(n > CHARBITS)
return 0;
if((m*CHARBITS)%n)
printf( "The last %d bit will be lost.\n ",(m*CHARBITS)%n);
for(i = 0; i < m; i++)
{
for(int k = CHARBITS-1; k > = 0; k--)
{
a = in[i];
temp[j] = a > > k;
temp[j] &= 1;
j++;
}
}
for(i = 0; i < j/n; i++)
{
out[t] = 0;
for(int k = 0; k < n; k++)
{
temp[n*i+k] < <= n-k-1;
out[t] |= temp[n*i+k];
}
t++;
}
free(temp);
temp = NULL;
return 1;
}
void main()
{
unsigned char buf[12] = {0x23,0x34,0xf3,0xab,0xcd,0x25,0x14,0x27,0x57,0xa4,0xc3,0x2e};
unsigned char out[4*CHARBITS];
int rst = fetch(buf,12,3,out);
if(!rst)
printf( "fail.\n ");
else
{
for(int i = 0; i < 4*CHARBITS; i++)
{
printf( "%x ",out[i]);
}
printf( "\nsuccess.\n ");
}
}
out数组就是:
提取出来的n位转化为一个unsigned char类型的数据
已测试!