Editor's note: COTD Entry: Power of 2 bitmasking tricks by Andy Younger [andyy@redlemon.com] /* * Here are a few nice tricks for 2's complement based machines * that I discovered a few months ago. */ inline int LowestBitMask(int v) { return ((v & -v)); } /* Confusing? A simpler version (not relying on 2's complement) is below * * If you don't understand what is going on, work it out on paper with the bitmasks */ inline int LowestBitMask_No2sComplement(int v) { return (v & ((~v)+1)); } /* Ok, so now we are cooking on gass. Here we use this function for some */ /* rather useful utility functions */ inline bool IsPow2(int v) { return (LowestBitMask(v) == v) ? true : false; } inline int CeilPow2(int v) { int i = LowestBitMask(v); while(i < v) i <<= 1; return i; } /* Here is some test code, to check the above works */ /* This tested with Cygwin's gcc & VC6 */ #include #include int main() { assert( IsPow2(128) ); assert( !IsPow2(15) ); assert( CeilPow2(0x200) == 0x200 ); assert( CeilPow2(0x201) == 0x400 ); assert( CeilPow2(0x3ff) == 0x400 ); assert( CeilPow2(0x400) == 0x400 ); assert( CeilPow2(0x401) == 0x800 ); return 0; } /* END! */