Страницы

Поиск по вопросам

вторник, 2 апреля 2019 г.

Спецификатор noexcept

class Math { public: static bool __fastcall IsPowerOfTwo( int x ) noexcept; };
__forceinline bool Math::IsPowerOfTwo( int x ) { // хз что делает :D return ( x & ( x - 1 ) ) == 0 && x > 0; }
noexcept надо тоже писать в определении?


Ответ

поясню про выражение
x & (x-1) == 0 && x > 0
оно проверяет положительное число x на степень двойки
тоесть это числа вида x = 2^i, где i позиция единственного единичного бита
в двоичном представлении имеют следующий вид:
0000...100000 = 2^i = x
а числа x - 1 имеют вид
0000...011111 = 1*2^i-1 + 1*2^i-2 + ... + 1*2^0 = x-1
тоесть все разряды начиная с i-1 ого единичные,
отсюда если побитово применить AND тоесть x & (x-1) получим 0 что означает что, число x это степень двойки, в противном случае, соотвественно не является степенью двойки

Комментариев нет:

Отправить комментарий