如何实现按位拷贝??
我有一个BYTE数组,存贮一些开关量信息,一个字节存贮八个开关量,用四个字节连续存贮,我想一次性从第五个开关量读取值,连续取10个开关量,即5-14 的开关量,如果方便的把它取出来?
[解决办法]
位操作 > <
[解决办法]
"方便 "怎么解释,你是在资源非常有限的环境下编程吗?
BYTE switch[4];
BOOL switch_5=switch[0]&0x10;
BOOL switch_6=switch[0]&0x20;
................
BOOL switch_10=swith[1]&0x02;
................
这样不可以?
或者为什么不用一个UINT型变量来代替4个byte变量?32位机上都是一个CPU指令吧?
[解决办法]
定义宏:
#define MYMASK 0x4fff0L
定义UINT
UINT OK;
memcpy(&OK,&BYTEARRAY,4);
UINT OKVal=OK & MYMASK;
[解决办法]
主要 用到 * 和 |
取指定位
比如 了 0x80中的 第 3位
0x80 & 4 [100(二进制)]
比如 了 0x80中的 第 4位
0x80 & 8 [1000(二进制)]
[解决办法]
struct MYSWITCH
{
unsigned sw32:1;
unsigned sw31:1;
unsigned sw30:1;
unsigned sw29:1;
unsigned sw28:1;
unsigned sw27:1;
unsigned sw26:1;
unsigned sw25:1;
unsigned sw24:1;
unsigned sw23:1;
unsigned sw22:1;
unsigned sw21:1;
unsigned sw20:1;
unsigned sw19:1;
unsigned sw18:1;
unsigned sw17:1;
unsigned sw16:1;
unsigned sw15:1;
unsigned sw14:1;
unsigned sw13:1;
unsigned sw12:1;
unsigned sw11:1;
unsigned sw10:1;
unsigned sw9 :1;
unsigned sw8 :1;
unsigned sw7 :1;
unsigned sw6 :1;
unsigned sw5 :1;
unsigned sw4 :1;
unsigned sw3 :1;
unsigned sw2 :1;
unsigned sw1 :1;
};
[解决办法]
MYSWITCH sw;
int x = 0x1234;
memcpy(&sw,&x,4);
[解决办法]
丢人。写错了。就用与就可以了。把不要的位置为0,需要的位置为1,得到个数字,和源数据与一下就出来了。……
[解决办法]
不算错啊!
[解决办法]
那就写个bitcpy的函数出来。应该不困难吧。
[解决办法]
先> > 移位,后和1与操作,用个for循环不就得了。
[解决办法]
说真的,我比较菜,自认写的不是很好看。凑合看看。但功能可以用:
函数如下:
//
//just copy bits,won 't care about overflow
//
void bitcpy(void* src,void* dst,int startPos,int len)
{
byte* bSrc = (byte*)src,*bDst = (byte*)dst;
int nSize = int((double)(len + startPos)/8.0 +0.5);
bSrc += int(startPos/8);
int nStartPos2 = startPos % 8;
len -= (startPos - nStartPos2);
for (int nByte = 0; nByte <nSize; nByte++)
{
byte bTemp = 1;
for (int j=0, nBit = nByte?0:nStartPos2;nBit <8;nBit++)
{
*bDst |= ((bSrc[nByte] & (bTemp < <nBit))> > nBit) < <j++;
}
bDst++;
}
}
//
//测试代码如下
//
void CTestAView::OnButton6()
{
unsigned int ua = 0x2348;
unsigned long ulb = 0;
bitcpy(&ua,&ulb,7,8);
}
结果,好像对了。