位掩码操作不清楚-代码正在做什么



知道这个函数返回什么吗?我不知道为什么它在第二行

上移动了1

感谢
bool findWhat(U32 bitmask)
{
U32 bitmaskOdd = bitmask & 0x55555555;
U32 bitmaskEven = (bitmask & 0xAAAAAAAA) >> 1;
U32 bitmaskXor = bitmaskOdd ^ bitmaskEven;

if (bitmaskXor & bitmaskEven)
{
return TRUE;
}
return FALSE;
}

以一个位掩码为例,其中包含相邻位在奇数和偶数位置上的所有四种可能的变体:

8 7 6 5 4 3 2 1    Position (counted 1-based)
0 0 0 1 1 0 1 1    bitmask

生成bitmaskOdd:

0 0 0 1 0 0 0 1    bits in odd positions are kept

resultbitmaskEvenwithout shift:

0 0 0 0 1 0 1 0    bits in even positions are kept

resultbitmaskEvenwith shift:

0 0 0 0 0 1 0 1    bits in even positions are kept but shifted

bitmaskXor作为bitmaskEvenbitmaskOdd的位XOR:

0 0 0 1 0 1 0 0

ANDbitmaskXorbitmaskEven:

0 0 0 0 0 1 0 0

由于AND不为零,函数返回true。这表示在偶数位和奇数位上存在一个相邻的位对,其中偶数位被设置,而奇数位没有被设置。

换句话说:函数返回true,如果至少有一个10对相邻的位,其中右边的位是奇数位。