Thursday, October 9, 2014

Round up to the next highest power of 2

unsigned int x; // calculate the next highest power of 2 of 32-bit x


x |= x >> 1;
x |= x >> 2;
x |= x >> 4;
x |= x >> 8;
x |= x >> 16;
x++;
 
 
Round up to the next highest power of 2 by float casting:

This operation is 3 times slower than above operation.

unsigned int const v; // Round this 32-bit value to the next highest power of 2
unsigned int r;       //  result here. (So v=3 -> r=4; v=8 -> r=8)

if (v > 1) 
{
  float f = (float)v;
  unsigned int const t = 1U << ((*(unsigned int *)&f >> 23) - 0x7f);
  r = t << (t < v);
}
else 
{
  r = 1;
}
 

No comments:

Post a Comment