我已经在这里解决了我的问题,但我不明白它为什么会起作用,或者 MS 是否在这里。我没有编写此代码,但我维护它。它是 DSP 应用程序的一部分,将数据作为位向量处理,并且有时必须将它们从字节中打包和解包。
这些是打包和拆包的方法
template<class TData> void CVector<TData>::Enqueue(uint32_t iInformation, const int iNumOfBits)
{
/* Enqueue bits in bit array */
for (int i = 0; i < iNumOfBits; i++)
{
/* We want to put the bits on the array with the MSB first */
/* Shift one bit to mask next bit at LSB-position */
operator[](iBitArrayCounter + iNumOfBits - i - 1) = _BINARY(iInformation & 1);
iInformation >>= 1;
}
iBitArrayCounter += iNumOfBits;
}
template<class TData> uint32_t CVector<TData>::Separate(const int iNumOfBits)
{
uint32_t iInformation;
if (iBitArrayCounter + iNumOfBits > iVectorSize)
return 0;
/* Separate out bits from bit-array */
iInformation = 0;
for (int i = 0; i < iNumOfBits; i++)
{
/* MSB comes first, therefore shift left */
iInformation <<= 1;
iInformation |= pData[iBitArrayCounter + i] & 1;
}
iBitArrayCounter += iNumOfBits;
return iInformation;
}
在哪里
typedef unsigned char _BINARY;
现在,这已经在 Windows、Mac 和 linux 上的连续 MS 编译器和 gcc 上工作了很多年。它仍然适用于调试模式下的所有编译器。在发布模式下的 MSVC9(我认为这是 Visual Studio 2010 的版本)中,我必须将 Enqueue 方法中的行从:
operator[](iBitArrayCounter + iNumOfBits - i - 1) = _BINARY(iInformation & 1);
至:
if(iInformation & 1)
operator[](iBitArrayCounter + iNumOfBits - i - 1) = 1;
else
operator[](iBitArrayCounter + iNumOfBits - i - 1) = 0;
该类是用 TData = _BINARY 实例化的。问题似乎是符号扩展,但入队和分离不是对称的。例如 65 被编码,然后分离为 193。
这是实际代码http://drm.cvs.sourceforge.net/viewvc/drm/drm/common/util/Vector.h?view=log的链接。1.8是修复。
我刚刚意识到应该用 TData 替换 _BINARY 宏,但在这种情况下,这无关紧要,因为无论如何都要用 _BINARY 实例化该类。