/* * (c) Copyright 2006, 2007, 2008, 2009 Hewlett-Packard Development Company, LP * All rights reserved. * [See end of file] */ package org.openjena.atlas.lib; // NB shifting is "mod 64" -- <<64 is a no-op (not a clear). // http://mindprod.com/jgloss/masking.html /** Utilities for manipulating a bit pattern which held in a 64 bit long * (java.util.BitSet does not allow getting the pattern as a long) * * @author Andy Seaborne * @version $Id: Bits.java,v 1.3 2007/01/02 11:51:49 andy_seaborne Exp $ */ public final class BitsLong { private BitsLong() {} // When this is false, no calls to check() should be generated. //public static final boolean CHECK = true ; private static int LongLen = Long.SIZE ; /** Extract the value packed into bits start (inclusive) and finish (exclusive), * the value is returned the low part of the returned long. * The low bit is bit zero. */ public static final long unpack(long 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<<(LongLen-finish)) >>> ((LongLen-finish)+start) ; } /** Place the value into the bit pattern between start and finish; * leaves other bits alone. */ public static final long pack(long bits, long value, int start, int finish) { check(start, finish) ; bits = clear$(bits, start, finish) ; long mask = mask(start, finish) ; bits = bits | ( (value<>> (LongLen-finish+start) ) << start ; } private static final long mask$(int bitIndex) { return 1L << bitIndex ; } private static final long mask$(int start, int finish) { // long mask = 0 ; // if ( finish == Long.SIZE ) // // <>> (LongLen-finish) ; // Clear the top bits // return mask >>> start << start ; // Clear the bottom bits return mask << (LongLen-finish) >>> (LongLen-finish+start) << start ; } private static final long maskZero$(int start, int finish) { return ~mask$(start, finish) ; } private static final void check(long bitIndex) { if ( bitIndex < 0 || bitIndex >= LongLen ) throw new IllegalArgumentException("Illegal bit index: "+bitIndex) ; } private static final void check(long start, long finish) { if ( start < 0 || start >= LongLen ) throw new IllegalArgumentException("Illegal start: "+start) ; if ( finish < 0 || finish > LongLen ) 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. */