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 это степень двойки, в противном случае, соотвественно не является степенью двойки
Комментариев нет:
Отправить комментарий