package org.krakenapps.btree;
import java.nio.ByteBuffer;
public class NumberEncoder {
public static int encode(ByteBuffer bb, long value) {
int len = lengthOf(value);
for (int i = 0; i < len; ++i) {
byte signalBit = (byte) (i != len - 1 ? 0x80 : 0);
byte data = (byte) (signalBit | (byte) (value >> (7 * (len - i - 1)) & 0x7F));
bb.put(data);
}
return len;
}
public static long decode(ByteBuffer bb) {
long value = 0L;
byte b;
do {
value = value << 7;
b = bb.get();
value |= b & 0x7F;
} while ((b & 0x80) == 0x80);
return value;
}
public static int toZNumber(short value) {
return (value << 1) ^ (value >> 15);
}
public static long toZNumber(long value) {
return (value << 1) ^ (value >> 63);
}
public static int toZNumber(int value) {
return (value << 1) ^ (value >> 31);
}
@Deprecated
private static int lengthOfRawNumber2(long value) {
int byteCount = 0;
if (value == 0)
return 1;
if (value < 0)
return 10; // max value
long val2 = value;
while (val2 != 0) {
val2 = val2 >> 7;
byteCount++;
}
return byteCount;
}
public static <T> int lengthOf(long value) {
if (value == 0)
return 1;
return (63 - Long.numberOfLeadingZeros(value)) / 7 + 1;
}
public static void main(String[] args) {
System.out.println("adsf");
System.out.println(lengthOf(-1));
System.out.println(lengthOf((0x1 << 7) - 1));
System.out.println(lengthOf((0x1 << 7) - 2));
System.out.println(lengthOf(0x1 << 7));
System.out.println(lengthOf(0x1 << 14 - 1));
System.out.println(lengthOf(0x1 << 14));
System.out.println(lengthOf(0x1 << 21 - 1));
System.out.println(lengthOf(0x1 << 21));
System.out.println(lengthOf(Long.MAX_VALUE));
System.out.println(lengthOf(Long.MIN_VALUE));
System.out.println("---");
System.out.println(lengthOfRawNumber2(-1));
System.out.println(lengthOfRawNumber2((0x1 << 7) - 1));
System.out.println(lengthOfRawNumber2((0x1 << 7) - 2));
System.out.println(lengthOfRawNumber2(0x1 << 7));
System.out.println(lengthOfRawNumber2(0x1 << 14 - 1));
System.out.println(lengthOfRawNumber2(0x1 << 14));
System.out.println(lengthOfRawNumber2(0x1 << 21 - 1));
System.out.println(lengthOfRawNumber2(0x1 << 21));
System.out.println(lengthOfRawNumber2(Long.MAX_VALUE));
System.out.println(lengthOfRawNumber2(Long.MIN_VALUE));
System.out.println("---");
System.out.println(Integer.MIN_VALUE);
System.out.println(toZNumber(Integer.MIN_VALUE) & -1L);
System.out.println("---");
long start = 0;
if (lengthOf(Integer.MAX_VALUE) != lengthOfRawNumber2(Integer.MAX_VALUE)) {
System.out.println("ERROR!");
}
start = System.currentTimeMillis();
for (int i = 0; i < 100000000; ++i) {
lengthOf(Integer.MAX_VALUE);
}
System.out.println(System.currentTimeMillis() - start);
start = System.currentTimeMillis();
for (int i = 0; i < 100000000; ++i) {
lengthOfRawNumber2(Integer.MAX_VALUE);
}
System.out.println(System.currentTimeMillis() - start);
}
}