#bit-manipulation
Вопрос:
Есть идеи, что возвращает эта функция? Я не уверен, почему он сдвинут на 1 во второй строке
Спасибо
bool findWhat(U32 bitmask)
{
U32 bitmaskOdd = bitmask amp; 0x55555555;
U32 bitmaskEven = (bitmask amp; 0xAAAAAAAA) >> 1;
U32 bitmaskXor = bitmaskOdd ^ bitmaskEven;
if (bitmaskXor amp; bitmaskEven)
{
return TRUE;
}
return FALSE;
}
Ответ №1:
Возьмем в качестве примера битовую маску со всеми четырьмя возможными вариантами соседних битов в нечетных и четных позициях:
8 7 6 5 4 3 2 1 Position (counted 1-based)
0 0 0 1 1 0 1 1 bitmask
Результирующий код битовой маски:
0 0 0 1 0 0 0 1 bits in odd positions are kept
Результирующая битовая маска даже без сдвига:
0 0 0 0 1 0 1 0 bits in even positions are kept
Результирующая битовая маска даже со сдвигом:
0 0 0 0 0 1 0 1 bits in even positions are kept but shifted
bitmaskXor как побитовое XOR
значение bitmaskEven и bitmaskOdd:
0 0 0 1 0 1 0 0
Побитовое AND
значение bitmaskXor и bitmaskEven:
0 0 0 0 0 1 0 0
Поскольку значение AND
не равно нулю, функция возвращает true
значение .
Это указывает на то, что существует смежная пара битов в четном и нечетном положении, где четный бит установлен, а нечетный бит не установлен.
Другими словами: функция возвращает true
, если имеется хотя бы одна 10
пара соседних битов, где правый бит находится в нечетном положении.