我目前遇到了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不再获得正确的值。我的代码有什么问题吗?我已经读过循环班次,但我不知道如何实现它。
提前致谢!
答案 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 );
}
很好,不是吗?