package edu.berkeley.nlp.lm.bits;
public class BitUtils
{
private static final long INT_BITS_MASK = ((1L << Integer.SIZE) - 1);
public static int getHighInt(long key) {
return ((int) (key >>> Integer.SIZE));
}
public static int abs(int a_) {
int a = a_;
int signMask = a >> (Integer.SIZE - 1); // make a mask of the sign bit
a ^= signMask; // toggle the bits if value is negative
a += signMask & 1;
return a;
}
public static long abs(long a_) {
long a = a_;
long signMask = a >> (Long.SIZE - 1); // make a mask of the sign bit
a ^= signMask; // toggle the bits if value is negative
a += signMask & 1;
return a;
}
public static int getLowInt(long key) {
return (int) getLowLong(key);
}
public static long getLowLong(long key) {
return (key & INT_BITS_MASK);
}
public static long setLowInt(long key, int i) {
return combineInts(i, getHighInt(key));
}
public static long setHighInt(long key, int i) {
return combineInts(getLowInt(key), i);
}
public static long max(long a_, long b) {
long a = a_;
a -= b;
a &= (~a) >> Long.SIZE - 1;
a += b;
return a;
}
public static long min(long a_, long b) {
long a = a_;
a -= b;
a &= a >> Long.SIZE - 1;
a += b;
return a;
}
public static long combineInts(int lowInt, int highInt) {
return (((long) highInt) << Integer.SIZE) | (lowInt & INT_BITS_MASK);
}
public static void main(String[] argv) {
long x = 0xfff;
x <<= Long.SIZE - 1;
x >>>= Long.SIZE - 1;
System.out.println(x);
}
}