Операция битовой маски не ясна — что делает код

#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 пара соседних битов, где правый бит находится в нечетном положении.