package com.navercorp.pinpoint.common.util;
/**
* copy from EncodingUtils
* -https://github.com/apache/thrift/blob/master/lib/java/src/org/apache/thrift/EncodingUtils.java
*
* @author Woonduk Kang(emeroad)
*/
public final class BitFieldUtils {
private BitFieldUtils() {
}
/**
* BitField utilities.
* Returns true if the bit at position is set in v.
*/
public static boolean testBit(byte v, int position) {
return testBit((int) v, position);
}
public static boolean testBit(short v, int position) {
return testBit((int) v, position);
}
public static boolean testBit(int v, int position) {
return (v & (1 << position)) != 0;
}
public static boolean testBit(long v, int position) {
return (v & (1L << position)) != 0L;
}
/**
* Returns v, with the bit at position set to zero.
*/
public static byte clearBit(byte v, int position) {
return (byte) clearBit((int) v, position);
}
public static short clearBit(short v, int position) {
return (short) clearBit((int) v, position);
}
public static int clearBit(int v, int position) {
return v & ~(1 << position);
}
public static long clearBit(long v, int position) {
return v & ~(1L << position);
}
/**
* Returns v, with the bit at position set to 1 or 0 depending on value.
*/
public static byte setBit(byte v, int position, boolean value) {
return (byte) setBit((int) v, position, value);
}
public static short setBit(short v, int position, boolean value) {
return (short) setBit((int) v, position, value);
}
public static int setBit(int v, int position, boolean value) {
if (value)
return v | (1 << position);
else
return clearBit(v, position);
}
public static long setBit(long v, int position, boolean value) {
if (value)
return v | (1L << position);
else
return clearBit(v, position);
}
public static int getBit(byte v, int position) {
return (v & (1 << position)) >>> position;
}
public static int getBit(short v, int position) {
return (v & (1 << position)) >>> position;
}
public static int getBit(int v, int position) {
return (v & (1 << position)) >>> position;
}
public static int getBit(long v, int position) {
return (int)((v & (1 << position)) >>> position);
}
public static int get2Bit(int v, int position) {
return getMultiBit(v, position, 2);
}
public static int getMultiBit(int v, int position, int bitSize) {
int shift = position;
int mask = 0;
for (int i = 0; i < bitSize; i++) {
mask |= ((v & (1 << shift)) >>> position);
shift++;
}
return mask;
}
// TODO validate position
// public static void checkByteBounds(int position) {
// assert position bounds
// }
//
// public static void checkShortBounds(int position) {
// assert position bounds
// }
}