/* * myLib - https://github.com/taktod/myLib * Copyright (c) 2014 ttProject. All rights reserved. * * Licensed under The MIT license. */ package com.ttProject.unit.extra; import java.util.ArrayList; import java.util.List; /** * make bit from multiple bit. * over 32bit, use getLong or setLong instead of get or set. * @author taktod */ public class BitN extends Bit { /** bit list. */ protected final List<Bit> bits = new ArrayList<Bit>(); /** * constructor * @param bits */ public BitN(Bit ... bits) { super(0); int count = 0; for(Bit bit : bits) { if(bit == null) { continue; } count += bit.bitCount; this.bits.add(bit); } bitCount = count; } /** * {@inheritDoc} */ @Override public int get() { int value = 0; for(Bit bit : bits) { value <<= bit.bitCount; value |= bit.get(); } return value; } /** * ref the data as long * @return */ public long getLong() { long value = 0; for(Bit bit : bits) { value <<= bit.bitCount; if(bit instanceof BitN) { value |= ((BitN) bit).getLong(); } else { value |= bit.get(); } } return value; } /** * {@inheritDoc} */ @Override public void set(int value) { int size = bits.size(); for(int i = size - 1;i >= 0;i --) { Bit bit = bits.get(i); bit.set(value); value >>>= bit.bitCount; } } /** * set the data as long * @param value */ public void setLong(long value) { int size = bits.size(); for(int i = size - 1;i >= 0;i --) { Bit bit = bits.get(i); bit.set((int)(value & 0xFFFFFFFF)); value >>>= bit.bitCount; } } /** * {@inheritDoc} */ @Override public String toString() { StringBuilder data = new StringBuilder(); for(Bit b : bits) { data.append(b.toString()); } return data.toString(); } }