这个pData [1 + 2 * i]<< 8 | pData [2 + 2 * i] C ++语法是什么意思?

时间:2011-01-11 09:55:28

标签: c++ visual-c++ bitwise-operators

pData[1+2*i]<<8|pData[2+2*i]的含义是什么pData[ ]是包含BYTE数据的数组? 我有以下功能 在主要功能

{
..........
....
BYTE Receivebuff[2048];
..
ReceiveWavePacket(&Receivebuff[i], nNextStep);
....
...
..
}

其中Receivebuff是BYTE类型的数组。

ReceiveWavePacket(BYTE * pData, UINT nSize)
{
 CString strTest;
 for(int i = 0 ; i < 60 ; i++)
 {
  strTest.Format("%d\n",(USHORT)(pData[1+2*i]<<8|pData[2+2*i]));
  m_edStatData.SetWindowTextA(strTest);
          }
}

我想知道“,(USHORT)(pData[1+2*i]<<8|pData[2+2*i])

的含义

任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:12)

这似乎是用于从两个八位值合成16位值的代码。如果你注意,数学的形式是

(a << 8) | b

对于合适的a和b。第一部分(a <&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&gt在这个新值和b的值之间应用按位OR运算符会创建一个新的16位值,其前8位是a的位(因为OR步骤的零扩展b使这些位保持不变)并且其低8位是b的位,因为将零位与b的位进行或运算得到b。

答案 1 :(得分:0)

我认为@templatetypedef是正确的,它看起来像通过对两个8位值进行逻辑“或”运算来创建16位值的代码。 (因为它是你的BYTE数组中的两个元素)。

两位的逻辑“或”基本上意味着,如果其中任何一位为1,则结果为1(“此位或该位”)。

作为另一个例子,看看这个函数,它接受一个指向char(大小为8位)的指针,并返回一个整数(在这个实现中,这意味着32位)。

int Read32(const char *pcData)
{
    return ( (pcData[3]<<24) & 0xff | pcData[2]<<16 | pcData[1]<<8 | pcData[0]);
}

如果pcData是指向char数组的指针,则它会找到它找到的第3个字符,并将其移位24位:

e.g。

如果pcData[3]是10110001,那么它现在是

10110001000000000000000000000000

它需要这个32位值,然后将它与pcData [2]进行OR运算,移位16位 - 这意味着如果pcData[2]11111111则32位值现在为:

10110001111111110000000000000000

pcData[1]pcData[0]

答案 2 :(得分:0)

@ templatetypedef的答案是正确的,但还有另一件有趣的事情发生在这里:

(pData[1+2*i]<<8|pData[2+2*i])

i从0到59,所以这将处理60个字,从pData[1]开始(1 + 2 * 0 == 1)。
这意味着数组中的第一个字节永远不会被处理,这似乎很奇怪。为什么这不是更自然的pData[2*i]<<8|pData[2*i+1]

一种可能性:字数据可以2种方式存储在字节流中:字0xAA11可以存储为0xAA 0x11或0x11 0xAA。想象一下,这是后者。

单词:0xAA11 0xBB22 0xCC33 ...
字节流将为11 AA 22 BB 33 CC ...

使用'自然'方法进行解析会产生0x11AA 0x22BB...,这显然是错误的。

此代码将打印0xAA22 0xBB33, 0xCC44 ....,这可能会通过快速查看完整性检查,但实际上完全不正确。

我希望额外+1不会被添加到“修复”字节序问题。