Hosting by PhotoTangler Collage Maker

This section of the archives stores flipcode's complete Developer Toolbox collection, featuring a variety of mini-articles and source code contributions from our readers.

 Power Of 2 Bitmasking Tricks   Submitted by

Here is a few cool bitmask tricks that I found out a while ago, I have put all the accompaning text in the comments in the code. Andrew Younger

 ```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! */ ```