public BitVector copy( final long from, final long to ) { BitVectors.ensureFromTo( length(), from, to ); final long length = to - from; final long l = length - length % Long.SIZE; final long bits[] = new long[ (int)( ( length + Long.SIZE - 1 ) / Long.SIZE ) ]; int i; for( i = 0; i < l; i += Long.SIZE ) bits[ i / Long.SIZE ] = getLong( from + i, from + i + Long.SIZE ); if ( i < length ) bits[ i / Long.SIZE ] = getLong( from + i, to ); return LongArrayBitVector.wrap( bits, length ); }
@Override public BitVector copy(final long from, final long to) { BitVectors.ensureFromTo(length(), from, to); return bitVector.copy(this.from + from, this.from + to); }
public long previousOne( final long index ) { if ( index == 0 ) return -1; final long[] bits = this.bits; final int from = word( index - 1 ); final long mask = 1L << bit( index - 1 ); final long maskedFirstWord = bits[ from ] & ( mask | mask - 1 ); if ( maskedFirstWord != 0 ) return from * BITS_PER_WORD + Fast.mostSignificantBit( maskedFirstWord ); for ( int i = from; i-- != 0; ) if ( bits[ i ] != 0 ) return i * BITS_PER_WORD + Fast.mostSignificantBit( bits[ i ] ); return -1; }
public boolean equals( final Object o ) { if ( ! ( o instanceof BitVector ) ) return false; BitVector v = (BitVector)o; long length = length(); if ( length != v.length() ) return false; while( length-- != 0 ) if ( getBoolean( length ) != v.getBoolean( length ) ) return false; return true; }
@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; }
@Override public boolean equals(final Object o) { if (! (o instanceof BitVector)) return false; final BitVector v = (BitVector)o; final long length = length(); if (length != v.length()) return false; final long fullLength = length - length % Long.SIZE; for(long i = 0; i < fullLength; i += Long.SIZE) if (getLong(i, i + Long.SIZE) != v.getLong(i, i + Long.SIZE)) return false; return getLong(fullLength, length) == v.getLong(fullLength, length); }
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; }
public long nextOne( final long index ) { if ( index >= length ) return -1; final long[] bits = this.bits; final long words = numWords( length ); final int from = word( index ); final long maskedFirstWord = bits[ from ] & -( 1L << bit( index ) ); if ( maskedFirstWord != 0 ) return from * BITS_PER_WORD + Fast.leastSignificantBit( maskedFirstWord ); for ( int i = from + 1; i < words; i++ ) if ( bits[ i ] != 0 ) return i * BITS_PER_WORD + Fast.leastSignificantBit( bits[ i ] ); return -1; }
@Override public long getLong(final long from, final long to) { BitVectors.ensureFromTo(length(), from, to); return bitVector.getLong(from + this.from, to + this.from); }
public SubBitVector( final BitVector l, final long from, final long to ) { BitVectors.ensureFromTo( l.length(), from, to ); this.from = from; this.to = to; bitVector = l; }
@Override public boolean set(final long index, final boolean value) { ensureIndex(index); return bitVector.set(from + index, value); }
public long getLong( long from, long to ) { if ( CHECKS ) BitVectors.ensureFromTo( length, from, to ); final long l = Long.SIZE - ( to - from ); final int startWord = word( from ); final int startBit = bit( from ); if ( l == Long.SIZE ) return 0; if ( startBit <= l ) return bits[ startWord ] << l - startBit >>> l; return bits[ startWord ] >>> startBit | bits[ startWord + 1 ] << Long.SIZE + l - startBit >>> l; }
@Override public boolean getBoolean(final long index) { ensureIndex(index); return bitVector.getBoolean(from + index); }
@Override public BitVector subVector(final long from, final long to) { BitVectors.ensureFromTo(length(), from, to); return new SubBitVector(bitVector, this.from + from, this.from + to); }
@Override public void add(final long index, final boolean value) { ensureIndex(index); bitVector.add(from + index, value); to++; }
public boolean equals( final Object o ) { if ( ! ( o instanceof BitVector ) ) return false; BitVector v = (BitVector)o; long length = length(); if ( length != v.length() ) return false; while( length-- != 0 ) if ( getBoolean( length ) != v.getBoolean( length ) ) return false; return true; }
public BitVector copy( final long from, final long to ) { BitVectors.ensureFromTo( length(), from, to ); final long length = to - from; final long l = length - length % Long.SIZE; final long bits[] = new long[ (int)( ( length + Long.SIZE - 1 ) / Long.SIZE ) ]; int i; for( i = 0; i < l; i += Long.SIZE ) bits[ i / Long.SIZE ] = getLong( from + i, from + i + Long.SIZE ); if ( i < length ) bits[ i / Long.SIZE ] = getLong( from + i, to ); return LongArrayBitVector.wrap( bits, length ); }
public BitVector copy( final long from, final long to ) { BitVectors.ensureFromTo( length(), from, to ); return bitVector.copy( this.from + from, this.from + to ); }
@Override public BitVector copy(final long from, final long to) { BitVectors.ensureFromTo(length(), from, to); final long length = to - from; final long l = length - length % Long.SIZE; final long bits[] = new long[(int)((length + Long.SIZE - 1) / Long.SIZE)]; long i; for(i = 0; i < l; i += Long.SIZE) bits[(int)(i / Long.SIZE)] = getLong(from + i, from + i + Long.SIZE); if (i < length) bits[(int)(i / Long.SIZE)] = getLong(from + i, to); return LongArrayBitVector.wrap(bits, length); }