July 2004 Archives

More Fun with Bits

The method below multiplies a float by 2 by manipulating its bits to increment the exponent. See the javadoc for Float.intBitsToFloat() for details on the IEEE754 floating-point representation. Unlike the previous blog entry, the methods used here have been around a long time.

static float multiplyByTwo(float x) {
    // View the float as 32 bits
    int bits = Float.floatToIntBits(x);
    // Extract the bits that represent the exponent
    int exponent = (bits >> 23) & 0xFF;
    // clear the exponent bits
    bits &= ~(0xFF << 23);
    // Increment the exponent and set this new value
    bits |= ((exponent+1) & 0xFF) << 23;
    // Return the bits as a float
    return Float.intBitsToFloat(bits);
}

Bit Tricks

Java 1.5 defines new bit-manipulation methods on Integer and Long. These are one of the minor changes attributable to Josh Bloch. Here's some code to play around with them.

static void bitTricks(int x) {
    // Approximate log2() with numberOfLeadingZeros()
    if (x > 0) 
	System.out.printf("base-2 log of %d is between %d and %d%n", x,
			  Integer.SIZE-1-Integer.numberOfLeadingZeros(x),
			  Integer.SIZE-Integer.numberOfLeadingZeros(x-1));

    // If 1 bits in an int are used to represent members of a set, then
    // bitCount() and highestOneBit() allow efficient counting and
    // iteration of the members of the set
    System.out.printf("%d has %d bits set.%n", x, Integer.bitCount(x));
    System.out.print(x + " = ");
    while(x != 0) {
	int highbit = Integer.highestOneBit(x);  // Get the highest bit
	System.out.print(highbit + "+");         // Print it out
	x &= ~highbit;                           // Clear it
    }
    System.out.println("0");
}

Books

Comprehensive coverage of Ruby 1.8 and 1.9

"The New Most Important Ruby Book"
Peter Cooper,
rubyinside.com

Completely updated for Ajax and Web 2.0

"A must-have reference"
Brendan Eich,
creator of JavaScript

The classic Java quick-reference