What's the best way to write a function with the following prototype:
unsigned power_of_two(const unsigned &max);
where the function should return the largest power of 2 that is < max.
You can of course do it the old-fashioned way:
Code:
unsigned power_of_two(const unsigned &max) {
unsigned result = 1;
while (result < max) {
result *= 2;
}
result /= 2;
return result;
}
Or you can do this:
Code:
unsigned power_of_two(const unsigned &max) {
unsigned result = max;
--result;
result |= result >> 1;
result |= result >> 2;
result |= result >> 4;
result |= result >> 8;
result |= result >> 16; // now all bits are set up to the most significant bit in _size
++result; // result is now the nearest power of 2 greater than or equal to _size
result = result >> 1; // result < _size
return result;
Or, in the same spirit as the second, and presumably slightly slower but more straightforward:
Code:
unsigned power_of_two(const unsigned &max) {
unsigned result = 1;
while (result < max) {
result = result << 1;
}
result = result >> 1;
return result;
}