Рекурсивная функция во время компиляции для вычисления следующей степени двух целого числа?
НаСайт Bit Twiddling Hacks следующий алгоритм предоставлен для округления целого числа до следующей степени двух:
unsigned int v; // compute the next highest power of 2 of 32-bit v
v--;
v |= v >> 1;
v |= v >> 2;
v |= v >> 4;
v |= v >> 8;
v |= v >> 16;
v++;
Я хотел бы написать функцию метапрограммирования, которая будет вычислять ту же операцию:
рекурсивно (для выполнения во время компиляции)для любого типа целого числа (оно должно даже работать для возможных неуклюжих нестандартных целых чисел любого размера, таких как 15 бит, 65 бит ...)и вот форма ожидаемой функции:
template
constexpr Type function(const Type value)
{
// Something here
}
Как это сделать ?
Пример: дляvalue = 42
должно вернуться64