package de.bse.vm.var; import de.bse.vm.var.format.Formatter; /** * A variable which consists of individually accessible bits. * * @author Elias Groll * @version 2.15 */ public class ConglomerateVariable implements IVariable { /** * @param bits * the bit[] which should be used to set a value. */ public ConglomerateVariable(Bit[] bits) { this.bits = bits; for (int i = 0; i < bits.length; i++) { if (this.bits[i] == null) { this.bits[i] = new Bit(0); } } this.maximum = (long) 1 << this.bits.length; } protected Bit[] bits; protected long maximum; private String cutToByteLength(String byteAsString) { String retVal = ""; if (byteAsString.length() > bits.length) { int index = byteAsString.length() - bits.length; retVal = byteAsString.substring(index); } else if (byteAsString.length() < bits.length) { int count = bits.length - byteAsString.length(); retVal = byteAsString; for (int i = 0; i < count; i++) { retVal = "0" + retVal; } } else { retVal = byteAsString; } return retVal; } public String toString() { String value = Formatter.convertToHexString(getValue()); return value; } /** * Get an individually accessible bit from the variable. * * @param num * the index of the bit in the variable * @return the bit at the specified index */ public Bit getBit(int num) { if (num >= 0 && num < bits.length) { return bits[num]; } else { return null; } } public long getValue() { long retVal = 0; long comp = 1; for (int i = bits.length - 1; i >= 0; i--) { if (bits[i].getValue() == 1) { retVal += comp; } comp *= 2; } return retVal; } public void setValue(long value) { long val = value; while (val < 0) { val = (maximum - (value * -1)); } String byteAsString = ""; byteAsString = Long.toBinaryString(val); byteAsString = cutToByteLength(byteAsString); for (int index = 0; index < bits.length; index++) { bits[index].setValue(Integer.parseInt(String.valueOf(byteAsString.charAt(index)))); } } public Bit[] getBits() { return bits; } public long getMaximum() { return maximum; } }