MFC Bitshift超过32位

时间:2011-03-09 09:17:19

标签: visual-c++ mfc bit-manipulation

我目前遇到了bithift运算符的问题。我不熟悉它,所以原谅这个蹩脚的问题。

我在下面有以下代码:

INT iBitShift = 82;
INT iMaxColumn = 82;
for ( iCol = 0; iCol < iMaxColumn; iCol++ ) {
    dwColumnBit = (dwNewBitmap >> iBitShift) & 0x01;

    if ( dwColumnBit ) {
        // do something..
    }
    iBitShift--;
}

当iMaxColumn小于30时它工作正常但是当它变成82时,问题就已经开始了。当iCol达到32和64时,dwColumnBit不再获得正确的值。我的代码有什么问题吗?我已经读过循环班次,但我不知道如何实现它。

提前致谢!

3 个答案:

答案 0 :(得分:1)

根据您的命名约定,我猜您正在尝试在DWORD上执行位移。 DWORD是4个字节,表示32位(在32位机器中)。因此,当您将DWORD移动32次时,您将在DWORD中拥有所有零。

此外,您的陈述:

(dwNewBitmap >> iBitShift) & 0x01

尝试移位超过32位,因为iBitShift用82初始化,这意味着考虑到只有32位可以移位,它将无法移位82位。

我希望这可以澄清你发现的'奇怪'行为。

编辑:基于来自OP的一些信息评论:

看起来位图以二进制数据的形式存储在注册表中。您需要将二进制数据读入一个字节数组,然后您可以分解逻辑,一次只从该数据中选择一个DWORD(在循环中执行此操作),然后从1中循环检查该DWORD的位通过这种方式,您将了解设置哪些位以及哪些位不是。

答案 1 :(得分:1)

当你跨越字边界时,你将失去一些东西。

您似乎想知道位iBitShift的值。您可能希望首先找到正确的单词(使用iBitShift/wordsize),然后移动其余位(使用iBitShift%wordsize):

template< typename T, int N >
bool bit( T (&words)[N], int iIndex ) {
    static const size_t bitsperword = 
      sizeof(T)*numeric_limits<unsigned char>::digits;
    // find proper word (assuming words[0] contains the first word)
    T word = words[ iIndex/bitsperword ];
    // shift the residue
    word >>= iIndex%bitsperword;
    return word & 0x1;        
}

int main(){
  int ints [] = {1,~0x0};
  for( int i = 0; i != sizeof(int)*sizeof(ints); ++i ) {
    printf("%d", bit(ints,i) ? 1:0);
  }
  return 0;
}

答案 2 :(得分:0)

由于您最终承认您在这里正在进行位图处理,因此您也可以考虑使用std::bitset<82>来完成任务。 bitset也可以与string进行转换。最重要的是,它适用于枚举!

enum column {
  colA, colB, ....
  , colMAX // keep this one last
};

bitset<colMAX> columnvisible;

columnvisible.set(colB);
columnvisible.reset(colA);

...
storeStringInRegistry( columnvisible.tostring() );

...
columnvisible = bitset<colMAX>( readStringFromRegistry() );

for( column c = colA; c != colMAX; ++c ) {
    if( columnvisible[c] ) displayColumn( c );
}

很好,不是吗?

相关问题