Проверка валидности битовой маски

Опубликовано Nov 25, 2011 в Манипуляция битами | 26 коммент.

, , ,

32-х битная “маска” считается действительной, если ее двоичное представление содержит непрерывный ряд “1″ и следующий за ним ряд “0″.

Пример правильных битовых масок:              Пример неправильных битовых масок:

11110000000000000000000000000000              10110000000000000000000000001000
11111000000000000000000000000000              01111100000000000000001000000001
11111111111100000000000000000000

Задача – разработать функцию проверки правильности битовой маски.

С++:                                       C#
bool isValidBitMask(DWORD mask)            bool isValidBitMask(System.Int32 mask)
{                                          {
    // ваш код                                   // ваш код
}                                          }

Для энтузиастов можно усложнить задачу, добавив требование о запрете на использование цикла.

Критерии оценки FulcrumWeb:

Кандидат должен продемонстрировать навыки работы с битовым представлением чисел, а также умение придумать и реализовать нужный алгоритм.

Ожидаемые вопросы:

  1. Будет ли валидной битовая маска 00111111111100000000000000000000? То есть, обязана ли валидная битовая маска начинаться с единицы (и заканчиваться нулем)?
  2. Я вижу в этой задачи эффективный способ использования хардкода. Есть ли ограничения на это?

Оценка результатов:

Никаких особых знаний, приобретаемых с опытом, для задачи не нужно. Изюминкой является видение варианта с введением хардкода при положительном ответе на первый вопрос и понимание того, что в данной задаче этот "нехороший" прием может быть оправданным.
Так же существует "идеальное" решение данной задачи, содержащие всего три простых битовых операции и одну операцию сравнения, но это уже ближе к постановке задач на олимпиадах.