私はここで問題を修正しましたが、なぜそれが機能するのか、または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が修正されました。
_BINARYマクロをTDataに置き換える必要があることに気づきましたが、この場合、クラスは_BINARYでインスタンス化されるため、問題にはなりません。