<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: bits code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Sun, 27 Jul 2008 07:30:19 GMT</pubDate>
    <description>DZone Snippets: bits code</description>
    <item>
      <title>Calculate 2 to the power of N</title>
      <link>http://snippets.dzone.com/posts/show/4495</link>
      <description>// Calculate 2 to the power of N&lt;br /&gt;// Returns "double" value&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        private double TwoPowerN(int n)&lt;br /&gt;        {&lt;br /&gt;            int k;&lt;br /&gt;            int i = 1;&lt;br /&gt;&lt;br /&gt;            for (k=1; k &lt;= n; k++)&lt;br /&gt;            {&lt;br /&gt;                    i = i * 2;   &lt;br /&gt;            }&lt;br /&gt;            return i&lt;br /&gt;        }&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Thu, 06 Sep 2007 10:21:15 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4495</guid>
      <author>dubby (Dave)</author>
    </item>
    <item>
      <title>BitField: A fast(ish), pure Ruby bit field "type"</title>
      <link>http://snippets.dzone.com/posts/show/4234</link>
      <description>&lt;code&gt;#        NAME: BitField&lt;br /&gt;#      AUTHOR: Peter Cooper&lt;br /&gt;#     LICENSE: MIT ( http://www.opensource.org/licenses/mit-license.php )&lt;br /&gt;#   COPYRIGHT: (c) 2007 Peter Cooper (http://www.petercooper.co.uk/)&lt;br /&gt;#     VERSION: v4&lt;br /&gt;#     HISTORY: v4 (fixed bug where setting 0 bits to 0 caused a set to 1)&lt;br /&gt;#              v3 (supports dynamic bitwidths for array elements.. now doing 32 bit widths default)&lt;br /&gt;#              v2 (now uses 1 &lt;&lt; y, rather than 2 ** y .. it's 21.8 times faster!)&lt;br /&gt;#              v1 (first release)&lt;br /&gt;#&lt;br /&gt;# DESCRIPTION: Basic, pure Ruby bit field. Pretty fast (for what it is) and memory efficient.&lt;br /&gt;#              I've written a pretty intensive test suite for it and it passes great. &lt;br /&gt;#              Works well for Bloom filters (the reason I wrote it).&lt;br /&gt;#&lt;br /&gt;#              Create a bit field 1000 bits wide&lt;br /&gt;#                bf = BitField.new(1000)&lt;br /&gt;#&lt;br /&gt;#              Setting and reading bits&lt;br /&gt;#                bf[100] = 1&lt;br /&gt;#                bf[100]    .. =&gt; 1&lt;br /&gt;#                bf[100] = 0&lt;br /&gt;#&lt;br /&gt;#              More&lt;br /&gt;#                bf.to_s = "10101000101010101"  (example)&lt;br /&gt;#                bf.total_set         .. =&gt; 10  (example - 10 bits are set to "1")&lt;br /&gt;&lt;br /&gt;class BitField&lt;br /&gt;  attr_reader :size&lt;br /&gt;  include Enumerable&lt;br /&gt;  &lt;br /&gt;  ELEMENT_WIDTH = 32&lt;br /&gt;  &lt;br /&gt;  def initialize(size)&lt;br /&gt;    @size = size&lt;br /&gt;    @field = Array.new(((size - 1) / ELEMENT_WIDTH) + 1, 0)&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  # Set a bit (1/0)&lt;br /&gt;  def []=(position, value)&lt;br /&gt;    if value == 1&lt;br /&gt;      @field[position / ELEMENT_WIDTH] |= 1 &lt;&lt; (position % ELEMENT_WIDTH)&lt;br /&gt;    elsif (@field[position / ELEMENT_WIDTH]) &amp; (1 &lt;&lt; (position % ELEMENT_WIDTH)) != 0&lt;br /&gt;      @field[position / ELEMENT_WIDTH] ^= 1 &lt;&lt; (position % ELEMENT_WIDTH)&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  # Read a bit (1/0)&lt;br /&gt;  def [](position)&lt;br /&gt;    @field[position / ELEMENT_WIDTH] &amp; 1 &lt;&lt; (position % ELEMENT_WIDTH) &gt; 0 ? 1 : 0&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  # Iterate over each bit&lt;br /&gt;  def each(&amp;block)&lt;br /&gt;    @size.times { |position| yield self[position] }&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  # Returns the field as a string like "0101010100111100," etc.&lt;br /&gt;  def to_s&lt;br /&gt;    inject("") { |a, b| a + b.to_s }&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  # Returns the total number of bits that are set&lt;br /&gt;  # (The technique used here is about 6 times faster than using each or inject direct on the bitfield)&lt;br /&gt;  def total_set&lt;br /&gt;    @field.inject(0) { |a, byte| a += byte &amp; 1 and byte &gt;&gt;= 1 until byte == 0; a }&lt;br /&gt;  end&lt;br /&gt;end&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Here's the tests if you want to run:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;require "test/unit"&lt;br /&gt;require "bitfield"&lt;br /&gt;&lt;br /&gt;class TestLibraryFileName &lt; Test::Unit::TestCase&lt;br /&gt;  def setup&lt;br /&gt;    @public_bf = BitField.new(1000)&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  def test_basic&lt;br /&gt;    assert_equal 0, BitField.new(100)[0]&lt;br /&gt;    assert_equal 0, BitField.new(100)[1]&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  def test_setting_and_unsetting&lt;br /&gt;    @public_bf[100] = 1&lt;br /&gt;    assert_equal 1, @public_bf[100]&lt;br /&gt;    @public_bf[100] = 0&lt;br /&gt;    assert_equal 0, @public_bf[100]&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def test_random_setting_and_unsetting&lt;br /&gt;    100.times do&lt;br /&gt;      index = rand(1000)&lt;br /&gt;      @public_bf[index] = 1&lt;br /&gt;      assert_equal 1, @public_bf[index]&lt;br /&gt;      @public_bf[index] = 0&lt;br /&gt;      assert_equal 0, @public_bf[index]&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  def test_multiple_setting&lt;br /&gt;    1.upto(999) do |pos|&lt;br /&gt;      2.times { @public_bf[pos] = 1 }&lt;br /&gt;      assert_equal 1, @public_bf[pos]&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def test_multiple_unsetting&lt;br /&gt;    1.upto(999) do |pos|&lt;br /&gt;      2.times { @public_bf[pos] = 0 }&lt;br /&gt;      assert_equal 0, @public_bf[pos]&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  def test_size&lt;br /&gt;    assert_equal 1000, @public_bf.size&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  def test_to_s&lt;br /&gt;    bf = BitField.new(10)&lt;br /&gt;    bf[1] = 1&lt;br /&gt;    bf[5] = 1&lt;br /&gt;    assert_equal "0100010000", bf.to_s&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  def test_total_set&lt;br /&gt;    bf = BitField.new(10)&lt;br /&gt;    bf[1] = 1&lt;br /&gt;    bf[5] = 1&lt;br /&gt;    assert_equal 2, bf.total_set&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Mon, 02 Jul 2007 01:16:55 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4234</guid>
      <author>peter (Peter Cooperx)</author>
    </item>
    <item>
      <title>Count number of set bits in an integer</title>
      <link>http://snippets.dzone.com/posts/show/4233</link>
      <description>&lt;code&gt;&lt;br /&gt;count = 0&lt;br /&gt;count += byte &amp; 1 and byte &gt;&gt;= 1 until byte == 0&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Mon, 02 Jul 2007 01:12:15 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4233</guid>
      <author>peter (Peter Cooperx)</author>
    </item>
    <item>
      <title>Bit Counting and clever loop condition</title>
      <link>http://snippets.dzone.com/posts/show/2674</link>
      <description>&lt;code&gt;&lt;br /&gt;unsigned bit_count(unsigned x) {&lt;br /&gt;    unsigned n;&lt;br /&gt;    for (n = 0; x; n++)&lt;br /&gt;        x &amp;= x-1;&lt;br /&gt;    return n;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sat, 23 Sep 2006 17:35:09 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/2674</guid>
      <author>nevadalife (nevada)</author>
    </item>
    <item>
      <title>Binary Data Parser //Javascript Class</title>
      <link>http://snippets.dzone.com/posts/show/685</link>
      <description>&lt;a href="http://www.jsfromhell.com/classes/binary-parser"&gt;&lt;br /&gt;&lt;br /&gt;This is a prototyped class written to serialize and unserialize binary data, so you can read and write binary data files to exchange with programs written in languages like C and Pascal.&lt;br /&gt;&lt;br /&gt;Currently the class is able to handle just the following types: signed integers (small 8 bits, short 16 bits, int 32 bits), unsigned integers (byte 8 bits, word 16 bits, dword 32 bits) and floating point (IEEE754 float 32 bits and double 64 bits).&lt;br /&gt;&lt;br /&gt;The endianess of the binary values representation can also be configured with the class.&lt;br /&gt;&lt;br /&gt;[UPDATED CODE AND HELP CAN BE FOUND HERE]&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There's a php version right &lt;a href="http://www.phpclasses.org/browse/package/2454.html"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Code&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;//+ Jonas Raoni Soares Silva&lt;br /&gt;//@ http://jsfromhell.com/classes/binary-parser [v1.0]&lt;br /&gt;&lt;br /&gt;BinaryParser = function( bigEndian, allowExceptions ){&lt;br /&gt;	this.bigEndian = bigEndian;&lt;br /&gt;	this.allowExceptions = allowExceptions;&lt;br /&gt;};&lt;br /&gt;with( { p: BinaryParser.prototype } ){&lt;br /&gt;	with( {p: ( p.Buffer = function( bigEndian, buffer ){ this.bigEndian = bigEndian || 0; this.buffer = []; this.setBuffer( buffer ); } ).prototype } ){&lt;br /&gt;		p.setBuffer = function( data ){&lt;br /&gt;			if( data ){&lt;br /&gt;				for( var l, i = l = data.length, b = this.buffer = new Array( l ); i; b[l - i] = data.charCodeAt( --i ) );&lt;br /&gt;				this.bigEndian &amp;&amp; b.reverse();&lt;br /&gt;			}&lt;br /&gt;		};&lt;br /&gt;		p.hasNeededBits = function( neededBits ){&lt;br /&gt;			return this.buffer.length &gt;= -( -neededBits &gt;&gt; 3 );&lt;br /&gt;		};&lt;br /&gt;		p.checkBuffer = function( neededBits ){&lt;br /&gt;			if( !this.hasNeededBits( neededBits ) )&lt;br /&gt;				throw new Error( "checkBuffer::missing bytes" );&lt;br /&gt;		};&lt;br /&gt;		p.readBits = function( start, length ){&lt;br /&gt;			//shl fix: Henri Torgemane ~1996 (compressed by Jonas Raoni)&lt;br /&gt;			function shl( a, b ){&lt;br /&gt;				for( ; b--; a = ( ( a %= 0x7fffffff + 1 ) &amp; 0x40000000 ) == 0x40000000 ? a * 2 : ( a - 0x40000000 ) * 2 + 0x7fffffff + 1 );&lt;br /&gt;				return a;&lt;br /&gt;			}&lt;br /&gt;			if( start &lt; 0 || length &lt;= 0 )&lt;br /&gt;				return 0;&lt;br /&gt;			this.checkBuffer( start + length );&lt;br /&gt;			for( var offsetLeft, offsetRight = start % 8, curByte = this.buffer.length - ( start &gt;&gt; 3 ) - 1, lastByte = this.buffer.length + ( -( start + length ) &gt;&gt; 3 ), diff = curByte - lastByte, sum = ( ( this.buffer[ curByte ] &gt;&gt; offsetRight ) &amp; ( ( 1 &lt;&lt; ( diff ? 8 - offsetRight : length ) ) - 1 ) ) + ( diff &amp;&amp; ( offsetLeft = ( start + length ) % 8 ) ? ( this.buffer[ lastByte++ ] &amp; ( ( 1 &lt;&lt; offsetLeft ) - 1 ) ) &lt;&lt; ( diff-- &lt;&lt; 3 ) - offsetRight : 0 ); diff; sum += shl( this.buffer[ lastByte++ ], ( diff-- &lt;&lt; 3 ) - offsetRight ) );&lt;br /&gt;			return sum;&lt;br /&gt;		};&lt;br /&gt;	}&lt;br /&gt;	p.warn = function( msg ){&lt;br /&gt;		if( this.allowExceptions )&lt;br /&gt;			throw new Error( msg );&lt;br /&gt;		return 1;&lt;br /&gt;	};&lt;br /&gt;	p.decodeFloat = function( data, precisionBits, exponentBits ){&lt;br /&gt;		var b = new this.Buffer( this.bigEndian, data );&lt;br /&gt;		b.checkBuffer( precisionBits + exponentBits + 1 );&lt;br /&gt;		var bias = Math.pow( 2, exponentBits - 1 ) - 1, signal = b.readBits( precisionBits + exponentBits, 1 ), exponent = b.readBits( precisionBits, exponentBits ), significand = 0,&lt;br /&gt;		divisor = 2, curByte = b.buffer.length + ( -precisionBits &gt;&gt; 3 ) - 1;&lt;br /&gt;		do&lt;br /&gt;			for( var byteValue = b.buffer[ ++curByte ], startBit = precisionBits % 8 || 8, mask = 1 &lt;&lt; startBit; mask &gt;&gt;= 1; ( byteValue &amp; mask ) &amp;&amp; ( significand += 1 / divisor ), divisor *= 2 );&lt;br /&gt;		while( precisionBits -= startBit );&lt;br /&gt;		return exponent == ( bias &lt;&lt; 1 ) + 1 ? significand ? NaN : signal ? -Infinity : +Infinity : ( 1 + signal * -2 ) * ( exponent || significand ? !exponent ? Math.pow( 2, -bias + 1 ) * significand : Math.pow( 2, exponent - bias ) * ( 1 + significand ) : 0 );&lt;br /&gt;	};&lt;br /&gt;	p.decodeInt = function( data, bits, signed ){&lt;br /&gt;		var b = new this.Buffer( this.bigEndian, data ), x = b.readBits( 0, bits ), max = Math.pow( 2, bits );&lt;br /&gt;		return signed &amp;&amp; x &gt;= max / 2 ? x - max : x;&lt;br /&gt;	};&lt;br /&gt;	p.encodeFloat = function( data, precisionBits, exponentBits ){&lt;br /&gt;		var bias = Math.pow( 2, exponentBits - 1 ) - 1, minExp = -bias + 1, maxExp = bias, minUnnormExp = minExp - precisionBits,&lt;br /&gt;		status = isNaN( n = parseFloat( data ) ) || n == -Infinity || n == +Infinity ? n : 0,&lt;br /&gt;		exp = 0, len = 2 * bias + 1 + precisionBits + 3, bin = new Array( len ),&lt;br /&gt;		signal = ( n = status !== 0 ? 0 : n ) &lt; 0, n = Math.abs( n ), intPart = Math.floor( n ), floatPart = n - intPart,&lt;br /&gt;		i, lastBit, rounded, j, result;&lt;br /&gt;		for( i = len; i; bin[--i] = 0 );&lt;br /&gt;		for( i = bias + 2; intPart &amp;&amp; i; bin[--i] = intPart % 2, intPart = Math.floor( intPart / 2 ) );&lt;br /&gt;		for( i = bias + 1; floatPart &gt; 0 &amp;&amp; i; ( bin[++i] = ( ( floatPart *= 2 ) &gt;= 1 ) - 0 ) &amp;&amp; --floatPart );&lt;br /&gt;		for( i = -1; ++i &lt; len &amp;&amp; !bin[i]; );&lt;br /&gt;		if( bin[( lastBit = precisionBits - 1 + ( i = ( exp = bias + 1 - i ) &gt;= minExp &amp;&amp; exp &lt;= maxExp ? i + 1 : bias + 1 - ( exp = minExp - 1 ) ) ) + 1] ){&lt;br /&gt;			if( !( rounded = bin[lastBit] ) )&lt;br /&gt;				for( j = lastBit + 2; !rounded &amp;&amp; j &lt; len; rounded = bin[j++] );&lt;br /&gt;			for( j = lastBit + 1; rounded &amp;&amp; --j &gt;= 0; ( bin[j] = !bin[j] - 0 ) &amp;&amp; ( rounded = 0 ) );&lt;br /&gt;		}&lt;br /&gt;		for( i = i - 2 &lt; 0 ? -1 : i - 3; ++i &lt; len &amp;&amp; !bin[i]; );&lt;br /&gt;		if( ( exp = bias + 1 - i ) &gt;= minExp &amp;&amp; exp &lt;= maxExp )&lt;br /&gt;			++i;&lt;br /&gt;		else if( exp &lt; minExp ){&lt;br /&gt;			exp != bias + 1 - len &amp;&amp; exp &lt; minUnnormExp &amp;&amp; this.warn( "encodeFloat::float underflow" );&lt;br /&gt;			i = bias + 1 - ( exp = minExp - 1 );&lt;br /&gt;		}&lt;br /&gt;		if( intPart || status !== 0 ){&lt;br /&gt;			this.warn( intPart ? "encodeFloat::float overflow" : "encodeFloat::" + status );&lt;br /&gt;			exp = maxExp + 1;&lt;br /&gt;			i = bias + 2;&lt;br /&gt;			if( status == -Infinity )&lt;br /&gt;				signal = 1;&lt;br /&gt;			else if( isNaN( status ) )&lt;br /&gt;				bin[i] = 1;&lt;br /&gt;		}&lt;br /&gt;		for( n = Math.abs( exp + bias ), j = exponentBits + 1, result = ""; --j; result = ( n % 2 ) + result, n = n &gt;&gt;= 1 );&lt;br /&gt;		for( n = 0, j = 0, i = ( result = ( signal ? "1" : "0" ) + result + bin.slice( i, i + precisionBits ).join( "" ) ).length, r = []; i; j = ( j + 1 ) % 8 ){&lt;br /&gt;			n += ( 1 &lt;&lt; j ) * result.charAt( --i );&lt;br /&gt;			if( j == 7 ){&lt;br /&gt;				r[r.length] = String.fromCharCode( n );&lt;br /&gt;				n = 0;&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;		r[r.length] = n ? String.fromCharCode( n ) : "";&lt;br /&gt;		return ( this.bigEndian ? r.reverse() : r ).join( "" );&lt;br /&gt;	};&lt;br /&gt;	p.encodeInt = function( data, bits, signed ){&lt;br /&gt;		var max = Math.pow( 2, bits );&lt;br /&gt;		( data &gt;= max || data &lt; -( max &gt;&gt; 1 ) ) &amp;&amp; this.warn( "encodeInt::overflow" ) &amp;&amp; ( data = 0 );&lt;br /&gt;		data &lt; 0 &amp;&amp; ( data += max );&lt;br /&gt;		for( var r = []; data; r[r.length] = String.fromCharCode( data % 256 ), data = Math.floor( data / 256 ) );&lt;br /&gt;		for( bits = -( -bits &gt;&gt; 3 ) - r.length; bits--; r[r.length] = "\0" );&lt;br /&gt;		return ( this.bigEndian ? r.reverse() : r ).join( "" );&lt;br /&gt;	};&lt;br /&gt;	p.toSmall    = function( data ){ return this.decodeInt( data,  8, true  ); };&lt;br /&gt;	p.fromSmall  = function( data ){ return this.encodeInt( data,  8, true  ); };&lt;br /&gt;	p.toByte     = function( data ){ return this.decodeInt( data,  8, false ); };&lt;br /&gt;	p.fromByte   = function( data ){ return this.encodeInt( data,  8, false ); };&lt;br /&gt;	p.toShort    = function( data ){ return this.decodeInt( data, 16, true  ); };&lt;br /&gt;	p.fromShort  = function( data ){ return this.encodeInt( data, 16, true  ); };&lt;br /&gt;	p.toWord     = function( data ){ return this.decodeInt( data, 16, false ); };&lt;br /&gt;	p.fromWord   = function( data ){ return this.encodeInt( data, 16, false ); };&lt;br /&gt;	p.toInt      = function( data ){ return this.decodeInt( data, 32, true  ); };&lt;br /&gt;	p.fromInt    = function( data ){ return this.encodeInt( data, 32, true  ); };&lt;br /&gt;	p.toDWord    = function( data ){ return this.decodeInt( data, 32, false ); };&lt;br /&gt;	p.fromDWord  = function( data ){ return this.encodeInt( data, 32, false ); };&lt;br /&gt;	p.toFloat    = function( data ){ return this.decodeFloat( data, 23, 8   ); };&lt;br /&gt;	p.fromFloat  = function( data ){ return this.encodeFloat( data, 23, 8   ); };&lt;br /&gt;	p.toDouble   = function( data ){ return this.decodeFloat( data, 52, 11  ); };&lt;br /&gt;	p.fromDouble = function( data ){ return this.encodeFloat( data, 52, 11  ); };&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Fri, 09 Sep 2005 07:44:38 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/685</guid>
      <author>jonasraoni (Jonas Raoni Soares Silva)</author>
    </item>
  </channel>
</rss>
