Skip to content

Instantly share code, notes, and snippets.

@tomjack
Created October 2, 2010 20:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tomjack/655c34875e3aef2afd9c to your computer and use it in GitHub Desktop.
Save tomjack/655c34875e3aef2afd9c to your computer and use it in GitHub Desktop.
/**
* Calculate how many bits wide a number is, i.e. position of highest 1 bit.
* Fully unraveled binary search method.
*
* @return p where 2**p is first power of two >= n. e.g. binary 0001_0101 ->
* 5, 0xffffffff -> 32, 0 -> 0, 1 -> 1, 2 -> 2, 3 -> 2, 4 -> 3
* (Vincent) Changed to return 2^n instead of n
* @author Dirk Bosmans Dirk.Bosmans@tijd.com
* @author Vincent Vollers
*/
static public final int get2Fold(int n) {
if (n < 0)
return 32;
if (n > 0x00010000) {
if (n > 0x01000000) {
if (n > 0x10000000) {
if (n > 0x40000000) {
// if ( n > 0x7fffffff )
// return 32
// else
// return 2147483648; is too much, so return -1
return -1;
} else {
// !( n > 0x3fffffff )
if (n > 0x20000000)
return 1073741824;
else
return 536870912;
}
} else {
// !( n > 0x0fffffff )
if (n > 0x04000000) {
if (n > 0x08000000)
return 268435456;
else
return 134217728;
} else {
// !( n > 0x03ffffff )
if (n > 0x02000000)
return 67108864;
else
return 33554432;
}
}
} else {
// !( n > 0x00ffffff )
if (n > 0x00100000) {
if (n > 0x00400000) {
if (n > 0x00800000)
return 16777216;
else
return 8388608;
} else {
// !( n > 0x003fffff )
if (n > 0x00200000)
return 4194304;
else
return 2097152;
}
} else {
// !( n > 0x000fffff )
if (n > 0x00040000) {
if (n > 0x00080000)
return 1048576;
else
return 524288;
} else {
// !( n > 0x0003ffff )
if (n > 0x00020000)
return 262144;
else
return 131072;
}
}
}
} else {
// !( n > 0x0000ffff )
if (n > 0x00000100) {
if (n > 0x00001000) {
if (n > 0x00004000) {
if (n > 0x00008000)
return 65536;
else
return 32768;
} else {
// !( n > 0x00003fff )
if (n > 0x00002000)
return 16384;
else
return 8192;
}
} else {
// !( n > 0x00000fff )
if (n > 0x00000400) {
if (n > 0x00000800)
return 4096;
else
return 2048;
} else {
// !( n > 0x000003ff )
if (n > 0x00000200)
return 1024;
else
return 512;
}
}
} else {
// !( n > 0x000000ff )
if (n > 0x00000010) {
if (n > 0x00000040) {
if (n > 0x00000080)
return 256;
else
return 128;
} else {
// !( n > 0x0000003f )
if (n > 0x00000020)
return 64;
else
return 32;
}
} else {
// !( n > 0x0000000f )
if (n > 0x00000004) {
if (n > 0x00000008)
return 16;
else
return 8;
} else {
// !( n > 0x00000003 )
if (n > 0x00000002)
return 4;
return n;
}
}
}
}
} // end widthInBits
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment