package chatty.util; /** * Provide a list of possible values and this encodes which one is currently * set in one number. This is possible for more than one sets of values. * * If first valueDef is [1,2,3,9] and second is [0,1] * * first value = 3 * second value = 0 * [1,0][9,3,2,1] * 0 1 0 1 0 0 = 20 * * @author tduva */ public class BitEncoder { private final int[][] valueDef; private final int[] values; public BitEncoder(int[]... valueDef) { this.valueDef = valueDef; this.values = new int[valueDef.length]; } public void setValue(int id, int value) { values[id] = value; } public int getValue(int id) { return values[id]; } public long encode() { int result = 0; int count = 0; for (int id=0;id<valueDef.length;id++) { for (int i=0;i<valueDef[id].length;i++) { if (valueDef[id][i] == values[id]) { result += Math.pow(2, count); } count++; } } return result; } public void decode(long value) { int count = 0; for (int id=0;id<valueDef.length;id++) { for (int i = 0; i < valueDef[id].length; i++) { long bitmask = (long) Math.pow(2, count); if ((value & bitmask) == bitmask) { values[id] = valueDef[id][i]; } count++; } } } }