请问:关于位移方面的

p1112 2007-10-11 04:11:59
一个128bits的block,里面的变量很多,有的1bit,有点是2bits.我需要取出其中哪一变量.现在用unsigned char uchar[10]做为参数传入函数,我想问下,我该怎么做?
...全文
284 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
p1112 2007-10-15
  • 打赏
  • 举报
回复
谢谢lyg_zy和chehw的帮助
Practise_Think 2007-10-14
  • 打赏
  • 举报
回复
这个好办,简单的做法是用位域来解决,让编译器给你做偏移,不过得注意内存顺序
chehw 2007-10-14
  • 打赏
  • 举报
回复
如果是从低位到高位依次写入bits[128], 则


unsigned char b[16];
for(int i=0;i<16;i++)
{
b[i]=0;
for(int j=0;j<8;j++)
{
b[i]|=(bits[i*8+j])<<j;
}
}
}
p1112 2007-10-13
  • 打赏
  • 举报
回复
怎么把8个bits合并成一个unsigned char 呢
p1112 2007-10-12
  • 打赏
  • 举报
回复
用mask怎么做呢?chehw
chehw 2007-10-12
  • 打赏
  • 举报
回复
上面的代码不行, g和h之间存在一个字节对齐的问题,导致有2位会丢失 看来只能用mask了
mynamelj 2007-10-12
  • 打赏
  • 举报
回复
一个int类型的地址空间模型
------------[4 byte]---------------
1 2 3 4
------------[32 bit]---------------
|||||||| |||||||| |||||||| ||||||||
00000000 00000000 00000000 00000000

一个char类型的地址空间模型
[1 byte]
[8 bit ]
00000000

所以一个int类型空间大小等于char[4]
chehw 2007-10-12
  • 打赏
  • 举报
回复

union BIT128
{
struct
{
DWORD a:9;
DWORD b:1;
DWORD c:1;
DWORD d:1;
DWORD e:4;
DWORD f:9;
DWORD g:5;
DWORD h:10;
DWORD i:8;
DWORD j:8;
DWORD k:8;
DWORD l:16;
DWORD m:16;
DWORD n:32;
};
BYTE data[16];
};

BIT128 *p=(BIT128 *)pData; //假设pData为你传递进去的unsigned char [0x10];
//取变量a: p->a
//取变量b: p->b


wawaku 2007-10-12
  • 打赏
  • 举报
回复
不明白为什么取不到.你是怎么构造的数组? ucchar[0] = 9;.....这样么? 那你的变量范围只能是0~255了. 如果是这样的话.取的时候直接再取回来就是啊.int a = ucchar[0]; 是这样么? 如果是存成二进制内存形式.一个整形的变量要占四个字节.
p1112 2007-10-12
  • 打赏
  • 举报
回复
最上面unsigned char uchar[10]应该是unsigned char uchar[16]
p1112 2007-10-12
  • 打赏
  • 举报
回复
是这样的,128bits里面有以下这些变量,后面跟的这位数:
a:9;
b:1;
c:1;
5:1;
e:4;
f:9;
g:5;
h:10;
i:8;
j:8;
k:8;
l:16;
m:16;
n:32;
要求是将这些变量分别取出来.我现在将这些变量放在一个unsigned char ucchar[16]数组里面,传进函数进行解析,传进函数后我应该怎么进行位操作,取得这些变量?

p1112 2007-10-12
  • 打赏
  • 举报
回复
好的,谢谢chehw和lyg_zy的帮助,我先试着做一下,有不懂的再向你们请教.
chehw 2007-10-12
  • 打赏
  • 举报
回复
1. 简单的方法可以定义一个BYTE bits[128]; 类似于lyg_zy的方法
用移位的方式依次将各变量值的每一位写至bit[i]中,再将每8个bits[i]合并成一个unsigned char

2. 复杂一点的方法可以用上面GetVariable的逆过程, 用&和|操作, 直接将变量写回unsigned char
p1112 2007-10-12
  • 打赏
  • 举报
回复
谢谢chehw和lyg_zy的帮助,如果我要把解析出来的变量的值,放在unsigned char uchar[16]数组里面又应该怎么做呢,
lyg_zy 2007-10-12
  • 打赏
  • 举报
回复
用bitset,函数大概如下:

#include <bitset>
/**
* 返回 uchar[16]总共128位的从nPosBegin开始位到nPosEnd结束位的数
*/
unsigned long GetBitNumber( unsigned char uchar[16],int nPosBegin,int nPosEnd )
{
/**
* 把你的uchar[16]转化到bitset<128>中
*/
using namespace std;
std::bitset< 128 > bit128 ;
for( long i = 0;i<16;i ++ )
{
std::bitset< 8 > bit8( uchar[i] );
for( long j = 0;j<8;j ++ )
{
bit128[i * 8 + j ] = bit8[j];
}
}

/**
* 把对应位返回到bitReturn中
*/
std::bitset< 32 > bitReturn;
for( long i = nPosBegin;i<= nPosEnd ;i++ )
{
bitReturn[ i - nPosBegin ] = bit128[i];
}

/**
* 返回结果
*/
return bitReturn.to_ulong();
}


大体测试代码如下:

BYTE byte16[ 16 ] ={ 0xE1,0xEF,0xCD };
int a = GetBitNumber( byte16,0,8 );
BYTE b = GetBitNumber( byte16,9,9 );

以上代码思路肯定是对的。可能bit位的高低位还有小问题,楼主自己调试一下吧。项目太忙,不能再仔细给调了
我大致看了下,应该问题不大。


chehw 2007-10-12
  • 打赏
  • 举报
回复


DWORD GetVariable(unsigned char *lpData, int nPos, int nBitCount)
{

DWORD dwTemp[2]={0};//因有可能跨DWORD的边界,用两个双字来存储临时数据
DWORD dwData=0; //存储变量值
DWORD dwMask=0;
int dwPos=nPos/32; //变量位于第几个双字
int bitPos=nPos%32; //在该双字中的位置


LPDWORD pCursor=(LPDWORD)(lpData+dwPos); //定位到所在的双字
DWORD dwLength=bitPos+nBitCount; //计算是否超出双字的边界

dwTemp[0]=*pCursor;

if(dwLength>32) //所取的变量跨DWORD的边界
{
int nBitLeft=dwLength-32; // 下一个双字掩码所需的位数
nBitCount-=nBitLeft; // 当前双字掩码所需的位数


dwTemp[1]=*(pCursor+1);

dwMask=(1<<nBitLeft)-1; //根据所需的位数和所处的位置生成掩码
dwData=dwTemp[1]&dwMask;
dwData<<=nBitCount; //移位
}

dwMask=((1<<nBitCount)-1)<<bitPos; //根据所需的位数和所处的位置生成掩码
dwData|=(dwTemp[0]&dwMask)>>bitPos;
return dwData;
}

int main()
{
static int nBitCount[]={9,1,1,1,4,9,5,10,8,8,8,16,16,32};//各变量占的位数
int nPos[14]; //保存各变量的位置
int i;
//初始化各变量所在位置
nPos[0]=0;
for(i=1;i<sizeof(nBitCount)/sizeof(nBitCount[0]);i++)
{
nPos[i]=nPos[i-1]+nBitCount[i-1]; //各变量的位置
}

DWORD dwH=GetVariable(aa.data, nPos[7], nBitCount[7]); //假设取h: 序号从0起始
return 0L;
}
seliber 2007-10-12
  • 打赏
  • 举报
回复
没有多看明白。、

p1112 2007-10-12
  • 打赏
  • 举报
回复
大家帮我看看怎么解决啊
liuxiuk 2007-10-12
  • 打赏
  • 举报
回复
mark..
dyw 2007-10-11
  • 打赏
  • 举报
回复
定义一个union,按两种方式存取:
union MyFlag
{
unsigned char uchar[10]; // 8 * 10 = 80, 参数位数可能不够
DWORD dwFlag[4]; // 32 * 4 = 128
};
加载更多回复(9)

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧