package mikera.vectorz;

import mikera.vectorz.impl.ABooleanVector;

/**
 * Boolean vector backed by densely packed single bits - constrained to 0.0 / 1.0 values
 * 
 * Setting the BitVector will set to 1.0 for any positive values (true) and 0.0 otherwise (false)
 * 
 * Intended for compact representation/storage of boolean vectors
 * 
 * @author Mike
 */

public final class BitVector extends ABooleanVector {
	private static final long serialVersionUID = 349277216077562294L;
	public static final double BIT_ON=1.0;
	public static final double BIT_OFF=0.0;
	public static final double BIT_THRESHOLD=0.0;
	
	private final long[] data;
	
	public BitVector(int length) {
		super(length);
		data=new long[requiredArraySize(length)];
		
	}

	private BitVector(AVector source) {
		this(source.length());
		set(source);
	}
	
	private BitVector(BitVector source) {
		this(source.data.clone(),source.length());
	}

	private BitVector(long[] data, int length) {
		super(length);
		this.data=data;
	}
	
	private int requiredArraySize(int length) {
		assert(length>=0);
		return (length+63)/64;
	}
	
	public static BitVector createLength(int length) {
		return new BitVector(length);
	}
	
	public static BitVector create(AVector source) {
		return new BitVector(source);
	}
	
	private final boolean getBit(int i) {
		return (((data[i>>>6] >>> (i%64))&1L)!=0L);
	}
	
	@Override
	public double unsafeGet(int i) {
		return getBit(i) ? BIT_ON : BIT_OFF;
	}

	@Override
	public double get(int i) {
		if ((i<0)||(i>=length)) throw new IndexOutOfBoundsException("Index = "+i);
		return getBit(i) ? BIT_ON : BIT_OFF;
	}
	
	@Override
	public boolean isFullyMutable() {
		return false;
	}
	
	@Override
	public boolean isView() {
		return false;
	}
	
	@Override
	public boolean isZero() {
		for (int i=0; i>>=1;
			}
			offset+=64;
		}
		return result;
	}
	
	@Override
	public double dotProduct(AVector v) {
		double result=0.0;
		int offset=0;
		for (int i=0; i>>=1;
			}
			offset+=64;
		}
		return result;
	}
	
	@Override 
	public void multiplyTo(double[] data, int offset) {
		int len = length();
		for (int i=0; i=length)) throw new IndexOutOfBoundsException("Index: "+i);
		int bit=i%64;
		long mask = (1L<>>6;
		data[p]=(data[p]&(~mask))|(value>BIT_THRESHOLD?mask:0L);
	}

	public static BitVector of(double... values) {
		int len=values.length;
		BitVector b=new BitVector(len);
		b.setElements(values);
		return b;
	}
	
	@Override
	public String toString() {
		StringBuilder sb=new StringBuilder();
		int length=length();
		sb.append('[');
		if (length>0) {
			sb.append(getBit(0)?'1':'0');
			for (int i = 1; i < length; i++) {
				sb.append(',');
				sb.append(getBit(i)?'1':'0');
			}
		}
		sb.append(']');
		return sb.toString();
	}
	
	@Override 
	public BitVector exactClone() {
		return new BitVector(this);
	}
}

 

Ads help maintain this website.