关于c的位操作有关问题

关于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++;
}
}