Еще один, хотя я использую цикл, но это намного быстрее, чем математические операнды
мощность двух «напольных» опций:
int power = 1;
while (x >>= 1) power <<= 1;
мощность двух «потолочных» опций:
int power = 2;
x--; // <<-- UPDATED
while (x >>= 1) power <<= 1;
UPDATE
Как уже упоминалось в комментариях, была ошибка в ceil
, где ее результат был неверным.
Вот полные функции:
unsigned power_floor(unsigned x) {
int power = 1;
while (x >>= 1) power <<= 1;
return power;
}
unsigned power_ceil(unsigned x) {
if (x <= 1) return 1;
int power = 2;
x--;
while (x >>= 1) power <<= 1;
return power;
}