/* * (c) Copyright 2006, 2007, 2008, 2009 Hewlett-Packard Development Company, LP * All rights reserved. * [See end of file] */ package atlas.lib; // NB shifting is "mod 32" -- <<32 is a no-op (not a clear). // http://mindprod.com/jgloss/masking.html /** Utilities for manipulating a bit pattern which held in a 32 bit int * * @author Andy Seaborne * @version $Id: Bits.java,v 1.3 2007/01/02 11:51:49 andy_seaborne Exp $ */ public final class BitsInt { private BitsInt() {} private static int IntLen = Integer.SIZE ; /** Extract the value packed into bits start (inclusive) and finish (exclusive), * the value is returned the low part of the returned int. * The low bit is bit zero. */ public static final int unpack(int bits, int start, int finish) { check(start, finish) ; if ( finish == 0 ) return 0 ; // Remove top bits by moving up. Clear bottom bits by them moving down. return (bits<<(IntLen-finish)) >>> ((IntLen-finish)+start) ; } /** Place the value into the bit pattern between start and finish; * leaves other bits aint. */ public static final int pack(int bits, int value, int start, int finish) { check(start, finish) ; bits = clear$(bits, start, finish) ; bits = bits | (value<>> (IntLen-finish+start) ) << start ; } private static final int mask$(int bitIndex) { return 1 << bitIndex ; } private static final int mask$(int start, int finish) { // int mask = 0 ; // if ( finish == int.SIZE ) // // <>> (intLen-finish) ; // Clear the top bits // return mask >>> start << start ; // Clear the bottom bits return mask << (IntLen-finish) >>> (IntLen-finish+start) << start ; } private static final int maskZero$(int start, int finish) { return ~mask$(start, finish) ; } private static final void check(int bitIndex) { if ( bitIndex < 0 || bitIndex >= IntLen ) throw new IllegalArgumentException("Illegal bit index: "+bitIndex) ; } private static final void check(int start, int finish) { if ( start < 0 || start >= IntLen ) throw new IllegalArgumentException("Illegal start: "+start) ; if ( finish < 0 || finish > IntLen ) throw new IllegalArgumentException("Illegal finish: "+finish) ; if ( start > finish ) throw new IllegalArgumentException("Illegal range: ("+start+", "+finish+")") ; } } /* * (c) Copyright 2006, 2007, 2008, 2009 Hewlett-Packard Development Company, LP * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */