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

Download Associated File: Pow2Fun.cpp (1,261 bytes)

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 <stdio.h> #include <assert.h> 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! */

The zip file viewer built into the Developer Toolbox made use of the zlib library, as well as the zlibdll source additions.

 

Copyright 1999-2008 (C) FLIPCODE.COM and/or the original content author(s). All rights reserved.
Please read our Terms, Conditions, and Privacy information.