Удобный метод проверки того, является ли положительное целое число n степенью двойки (например, 1, 2, 4, 8 и т. д.), заключается в использовании следующего теста на наличие не более 1 установленного бита:
Эта операция может быть очень эффективной, поскольку она включает в себя только вычитание, побитовое И и условный переход по нулевому флагу (ZF). Если это выражение принимает значение true, то число n действительно является степенью двойки.
Другой метод использует std::popcount (подсчет населения), которая является частью стандартной библиотеки C++20, для теста:
Код: Выделить всё
bool test = std::popcount(n) == 1; // (Since C++20)
Эта функция подсчитывает количество установленных бит (1 с). Если оборудование поддерживает инструкцию popcount (POPCNT), эта функция может работать очень быстро.
В C++ вы обычно «платите за то, что используете». Для этого теста подсчет бесполезен.
Какой метод лучше с точки зрения эффективности процессора?
Подробнее здесь:
https://stackoverflow.com/questions/786 ... 1-2-4-8-et