public BitVector length( long newLength ) { final long length = length(); if ( length < newLength ) for( long i = newLength - length; i-- != 0; ) add( false ); else for( long i = length; i-- != newLength; ) removeBoolean( i ); return this; }
@Override public void fill(final long from, final long to, final int value) { fill(from, to, value != 0); } @Override
public long nextOne( final long index ) { final long length = length(); for( long i = index; i < length; i++ ) if ( getBoolean( i ) ) return i; return -1; }
public void flip( final int index ) { set( index, ! getBoolean( index ) ); }
@Override public long previousZero(final long index) { for (long i = index; i-- != 0;) if (! getBoolean(i)) return i; return -1; }
@Override public BitVector replace(final BitVector bv) { clear(); final long fullBits = bv.length() - bv.length() % Long.SIZE; for(long i = 0; i < fullBits; i += Long.SIZE) append(bv.getLong(i, i + Long.SIZE), Long.SIZE); if (bv.length() % Long.SIZE != 0) append(bv.getLong(fullBits, bv.length()), (int)(bv.length() - fullBits)); return this; }
public BitVector append( final long value, final int k ) { for( int i = 0; i < k; i++ ) add( ( value & 1L << i ) != 0 ); return this; }
@Override public int compareTo( final List<? extends Boolean> list ) { if ( list instanceof BitVector ) return compareTo( (BitVector)list ); return super.compareTo( list ); }
public BitVector append( final BitVector bv ) { final long length = bv.length(); final long l = length - length % Long.SIZE; int i; for( i = 0; i < l; i += Long.SIZE ) append( bv.getLong( i, i + Long.SIZE ), Long.SIZE ); if ( i < length ) append( bv.getLong( i, length ), (int)( length - i ) ); return this; }
/** Returns an instance of {@link LongArrayBitVector} containing a copy of this bit vector. * * @return an instance of {@link LongArrayBitVector} containing a copy of this bit vector. */ @Override public BitVector fast() { return copy(); }
public BitVector and( final BitVector v ) { if ( v instanceof LongArrayBitVector ) { LongArrayBitVector l = (LongArrayBitVector)v; int words = Math.min( numWords( length() ), numWords( l.length() ) ); while( words-- != 0 ) bits[ words ] &= l.bits[ words ]; } else super.and( v ); return this; }
@Override public boolean equals(final Object o) { if (o instanceof LongArrayBitVector) return equals((LongArrayBitVector) o); return super.equals(o); }
public long[] bits() { final long[] bits = new long[ (int)( ( length() + LongArrayBitVector.BITS_PER_WORD - 1 ) >> LongArrayBitVector.LOG2_BITS_PER_WORD ) ]; final long length = length(); for( int i = 0; i < length; i++ ) if ( getBoolean( i ) ) bits[ i >> LongArrayBitVector.LOG2_BITS_PER_WORD ] |= 1L << ( i & LongArrayBitVector.WORD_MASK ); return bits; }