位移操作 高位移向地位、设置或修改任意位数的值。

①buf[nPackLen++] = (BYTE)( m_dwIDCode >> 24);m_dwIDCode 有四个字节,一共32位,移动24位,就是把高字节移向低字节。(BYTE)截取一个字节;
②buf[nPackLen++] = (BYTE)( m_dwIDCode >> 16);
③buf[nPackLen++] = (BYTE)( m_dwIDCode >> 8);
④buf[nPackLen++] = (BYTE)( m_dwIDCode);

m_dwIDCode 有四个字节,如下面;

a b c d 

①:移动24位,得到结果 0000000 a,用(BYTE)截取一个字节,以为BYTE占一个自己,如果是unshort 的话,就是2字节;

②移动16位,得到结果 o o a b ,用(BYTE)截取一个字节,得到b.

③ 移动8位 得到结果 0 a b c ,用(BYTE)截取一个字节,得到c

④。直接用(BYTE)截取一个字节,得到低字节。d;

按位与可以有两种作用:

(1)清零。如果想将一个单元清零,即使其全部二进制位为0,只要与一个各位都为零的数值相与,结果为零。

(2)取一个数中指定位

方法:找一个数,对应X要取的位,该数的对应位为1,其余位为零,此数与X进行“与运算”可以得到X中的指定位。

例:设X=10101110,

    取X的低4位,用 X & 0000 1111 = 0000 1110 即可得到;

    还可用来 取X的2、4、6位。

低字节在前的数据的处理:

BYTE  byInfoBuf[2];//获取后的数据时低字节在前的;

int fno = CP5200_ParseOpenFileRet( hObj , byRecvBuf , nReadLen , byInfoBuf , sizeof(byInfoBuf) );

WORD dno = byInfoBuf[0] + (byInfoBuf[1]<<8);//因为byInfoBuf[1] 是高字节,所有向左移动一个字节,也就是8为,加上 byInfoBuf[0],就是原来的值。

比如  byInfoBuf[0] = 00000001;

   byInfoBuf[1] = 00000100;

byInfoBuf[1]<<8 = 00000100 00000000;

加上  byInfoBuf[0]                  00000001

就得到                  00000100  00000001

 ***********************************************************************************************************************

设置、查询、任意位数的值;

1.如果要查询任意一位的值:

BYTE bydata =0x05;

如果要查询第三位的值;

首先要判断第三位的值是0或者是1;

BYTE temp = bydata&0000100//也就是  bydata&0x04;

if(temp>0)//表明第三位是1;

{

  bydata = bydata&11111011//这是第三位的值变为0,其它的值不变;

}

 else//表明第三位是1

{

}

 2.修改任意位的值

想修改第3位的值为0;

bydata = bydata&11111011//这样不管第三位原来的值是1或者是0,现在第三位的值一定是0;

想修改第3位的值为1;

bydata = bydata|00000100//这样不管第三位原来的值是1或者是0,现在第三位的值一定是1;

 如果想把第二位改为1;

过程就是这个样子

bydata = bydata|00000010//这样不管第2位原来的值是1或者是0,现在第三位的值一定是1;

原文地址:https://www.cnblogs.com/chenzuoyou/p/3135359.html