/**
Copyright (C) SYSTAP, LLC DBA Blazegraph 2006-2016. All rights reserved.
Contact:
SYSTAP, LLC DBA Blazegraph
2501 Calvert ST NW #106
Washington, DC 20008
licenses@blazegraph.com
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package com.bigdata.util;
import it.unimi.dsi.bits.BitVector;
import java.nio.ByteBuffer;
/**
* Simple helper class to work with bits inside a byte. Useful for classes
* that have a lot of boolean properties or pointers to enums that can be
* more compactly represented as a series of bit flags. See SPO.
*
* @author mikepersonick
*/
public class Bits {
/**
* Set a bit inside a byte.
*
* @param bits
* the original byte
* @param i
* the bit index (0 through 7)
* @param bit
* the bit value
* @return
* the new byte
*/
public static byte set(final byte bits, final int i, final boolean bit) {
// check to see if bits[i] == bit already, if so, nothing to do
// also does range check on i
if (get(bits, i) == bit)
return bits;
byte b = bits;
if (bit) {
b = (byte) (b | (0x1 << i));
} else {
b = (byte) (b & ~(0x1 << i));
}
return b;
}
/**
* Get a bit from inside a byte.
*
* @param bits
* the byte
* @param i
* the bit index (0 through 7)
* @return
* the bit value
*/
public static boolean get(final byte bits, final int i) {
if (i < 0 || i > 7) {
throw new IndexOutOfBoundsException();
}
return (bits & (0x1 << i)) != 0;
}
/**
* Get a new byte, masking off all but the bits specified by m.
*
* @param bits
* the original byte
* @param m
* the bits to keep, all others will be masked
* @return
* the new byte
*/
public static byte mask(final byte bits, final int... m) {
byte b = 0;
for (int i = 0; i < m.length; i++) {
if (m[i] < 0 || m[i] > 7) {
throw new IndexOutOfBoundsException();
}
b |= (0x1 << m[i]);
}
b &= bits;
return b;
}
/**
* Useful for debugging.
*
* @param bits
* the byte
* @return
* the unsigned binary string representation
*/
public static String toString(final byte bits) {
final byte[] d = new byte[] { bits };
final ByteBuffer b = ByteBuffer.wrap(d);
final BitVector v = new ByteBufferBitVector(b);
return v.toString();
}
}