public int hashCode() { final long length = length(); long fullLength = length - length % Long.SIZE; long h = 0x9e3779b97f4a7c13L ^ length; for( long i = 0; i < fullLength; i += Long.SIZE ) h ^= ( h << 5 ) + getLong( i, i + Long.SIZE ) + ( h >>> 2 ); if ( length != fullLength ) h ^= ( h << 5 ) + getLong( fullLength, length ) + ( h >>> 2 ); return (int)( ( h >>> 32 ) ^ h ); }
public int hashCode() { final long length = length(); long fullLength = length - length % Long.SIZE; long h = 0x9e3779b97f4a7c13L ^ length; for( long i = 0; i < fullLength; i += Long.SIZE ) h ^= ( h << 5 ) + getLong( i, i + Long.SIZE ) + ( h >>> 2 ); if ( length != fullLength ) h ^= ( h << 5 ) + getLong( fullLength, length ) + ( h >>> 2 ); return (int)( ( h >>> 32 ) ^ h ); }
@Override public int hashCode() { final long length = length(); final long fullLength = length - length % Long.SIZE; long h = 0x9e3779b97f4a7c13L ^ length; for(long i = 0; i < fullLength; i += Long.SIZE) h ^= (h << 5) + getLong(i, i + Long.SIZE) + (h >>> 2); if (length != fullLength) h ^= (h << 5) + getLong(fullLength, length) + (h >>> 2); return (int)((h >>> 32) ^ h); }
public long getLong( final long from, final long to ) { if ( from % Long.SIZE == 0 && to % Character.SIZE == 0 ) { long l; int pos = (int)( from / Character.SIZE ); if ( to == from + Long.SIZE ) l = ( ( to > actualEnd ? 0 : (long)s.charAt( pos + 3 ) ) << 48 | (long)s.charAt( pos + 2 ) << 32 | (long)s.charAt( pos + 1 ) << 16 | s.charAt( pos ) ); else { l = 0; final int residual = (int)( Math.min( actualEnd, to ) - from ); for( int i = residual / Character.SIZE; i-- != 0; ) l |= (long)s.charAt( pos + i ) << i * Character.SIZE; } l = ( l & 0x5555555555555555L ) << 1 | ( l >>> 1 ) & 0x5555555555555555L; l = ( l & 0x3333333333333333L ) << 2 | ( l >>> 2 ) & 0x3333333333333333L; l = ( l & 0x0f0f0f0f0f0f0f0fL ) << 4 | ( l >>> 4 ) & 0x0f0f0f0f0f0f0f0fL; return ( l & 0x00ff00ff00ff00ffL ) << 8 | ( l >>> 8 ) & 0x00ff00ff00ff00ffL; } return super.getLong( from, to ); }
public long getLong( final long from, final long to ) { if ( from % Long.SIZE == 0 && to % Character.SIZE == 0 ) { long l; int pos = (int)( from / Character.SIZE ); if ( to == from + Long.SIZE ) l = ( ( to > actualEnd ? 0 : (long)s.charAt( pos + 3 ) ) << 48 | (long)s.charAt( pos + 2 ) << 32 | (long)s.charAt( pos + 1 ) << 16 | s.charAt( pos ) ); else { l = 0; final int residual = (int)( Math.min( actualEnd, to ) - from ); for( int i = residual / Character.SIZE; i-- != 0; ) l |= (long)s.charAt( pos + i ) << i * Character.SIZE; } l = ( l & 0x5555555555555555L ) << 1 | ( l >>> 1 ) & 0x5555555555555555L; l = ( l & 0x3333333333333333L ) << 2 | ( l >>> 2 ) & 0x3333333333333333L; l = ( l & 0x0f0f0f0f0f0f0f0fL ) << 4 | ( l >>> 4 ) & 0x0f0f0f0f0f0f0f0fL; return ( l & 0x00ff00ff00ff00ffL ) << 8 | ( l >>> 8 ) & 0x00ff00ff00ff00ffL; } return super.getLong( from, to ); }
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 ); 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); 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); }
@Override public long longestCommonPrefixLength(final BitVector v) { final long minLength = Math.min(length(), v.length()); final long l = minLength - minLength % Long.SIZE; long w0, w1; long i; for(i = 0; i < l; i += Long.SIZE) { w0 = getLong(i, i + Long.SIZE); w1 = v.getLong(i, i + Long.SIZE); if (w0 != w1) return i + Long.numberOfTrailingZeros(w0 ^ w1); } w0 = getLong(i, minLength); w1 = v.getLong(i, minLength); if (w0 != w1) return i + Long.numberOfTrailingZeros(w0 ^ w1); return minLength; }
@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); }
@Override public boolean equals(final BitVector v, final long start, final long end) { long startFull = start - start % LongArrayBitVector.BITS_PER_WORD; final long endFull = end - end % LongArrayBitVector.BITS_PER_WORD; final int startBit = (int)(start & LongArrayBitVector.WORD_MASK); final int endBit = (int)(end & LongArrayBitVector.WORD_MASK); if (startFull == endFull) return ((getLong(startFull, Math.min(length(), startFull + Long.SIZE)) ^ v.getLong(startFull, Math.min(v.length(), startFull + Long.SIZE))) & ((1L << (endBit - startBit)) - 1) << startBit) == 0; if (((getLong(startFull, startFull + Long.SIZE) ^ v.getLong(startFull, startFull += Long.SIZE)) & (-1L << startBit)) != 0) return false; while(startFull < endFull) if (getLong(startFull, startFull + Long.SIZE) != v.getLong(startFull, startFull += Long.SIZE)) return false; return ((getLong(startFull, Math.min(length(), startFull + Long.SIZE)) ^ v.getLong(startFull, Math.min(v.length(), startFull + Long.SIZE))) & (1L << endBit) - 1) == 0; }
public long getLong( final long from, final long to ) { final int startBit = (int)( from % Long.SIZE ); if ( startBit == 0 && to - from == Long.SIZE ) { long word = v.getLong( from / 2, Math.min( v.length(), from / 2 + Long.SIZE ) ); if ( from % 2 != 0 ) word >>>= Long.SIZE / 2; else word &= 0xFFFFFFFFL; word = ( word | word << 16 ) & 0x0000FFFF0000FFFFL; //System.err.println( Long.toHexString( word ) ); word = ( word | word << 8 ) & 0x00FF00FF00FF00FFL; //System.err.println( Long.toHexString( word ) ); word = ( word | word << 4 ) & 0x0F0F0F0F0F0F0F0FL; //System.err.println( Long.toHexString( word ) ); word = ( word | word << 2 ) & 0x3333333333333333L; //System.err.println( Long.toHexString( word ) ); word = ( word << 1 | word << 2 ) | 0x5555555555555555L; //System.err.println( Long.toHexString( word ) ); return word; } // TODO: implement in a fast way the case startBit == 0, to == length. return super.getLong( from, to ); }
public long getLong( final long from, final long to ) { final int startBit = (int)( from % Long.SIZE ); if ( startBit == 0 && to - from == Long.SIZE ) { long word = v.getLong( from / 2, Math.min( v.length(), from / 2 + Long.SIZE ) ); if ( from % 2 != 0 ) word >>>= Long.SIZE / 2; else word &= 0xFFFFFFFFL; word = ( word | word << 16 ) & 0x0000FFFF0000FFFFL; //System.err.println( Long.toHexString( word ) ); word = ( word | word << 8 ) & 0x00FF00FF00FF00FFL; //System.err.println( Long.toHexString( word ) ); word = ( word | word << 4 ) & 0x0F0F0F0F0F0F0F0FL; //System.err.println( Long.toHexString( word ) ); word = ( word | word << 2 ) & 0x3333333333333333L; //System.err.println( Long.toHexString( word ) ); word = ( word << 1 | word << 2 ) | 0x5555555555555555L; //System.err.println( Long.toHexString( word ) ); return word; } // TODO: implement in a fast way the case startBit == 0, to == length. return super.getLong( from, to ); }
public int compareTo( final BitVector v ) { final long minLength = Math.min( length(), v.length() ); final long l = minLength - minLength % Long.SIZE; long w0, w1, xor; int i; for( i = 0; i < l; i += Long.SIZE ) { w0 = getLong( i, i + Long.SIZE ); w1 = v.getLong( i, i + Long.SIZE ); xor = w0 ^ w1; if ( xor != 0 ) return ( xor & -xor & w0 ) == 0 ? -1 : 1; } w0 = getLong( i, minLength ); w1 = v.getLong( i, minLength ); xor = w0 ^ w1; if ( xor != 0 ) return ( xor & -xor & w0 ) == 0 ? -1 : 1; return Long.signum( length() - v.length() ); }
public int compareTo( final BitVector v ) { final long minLength = Math.min( length(), v.length() ); final long l = minLength - minLength % Long.SIZE; long w0, w1, xor; int i; for( i = 0; i < l; i += Long.SIZE ) { w0 = getLong( i, i + Long.SIZE ); w1 = v.getLong( i, i + Long.SIZE ); xor = w0 ^ w1; if ( xor != 0 ) return ( xor & -xor & w0 ) == 0 ? -1 : 1; } w0 = getLong( i, minLength ); w1 = v.getLong( i, minLength ); xor = w0 ^ w1; if ( xor != 0 ) return ( xor & -xor & w0 ) == 0 ? -1 : 1; return Long.signum( length() - v.length() ); }
@Override public long getLong(final long from, final long to) { // The following code is optimized for word-by-word reading. if (from % Long.SIZE == 0) { if (to == from + Long.SIZE) { long word = v.getLong(from / 2, from / 2 + Long.SIZE / 2); word = (word | word << 16) & 0x0000FFFF0000FFFFL; word = (word | word << 8) & 0x00FF00FF00FF00FFL; word = (word | word << 4) & 0x0F0F0F0F0F0F0F0FL; word = (word | word << 2) & 0x3333333333333333L; return word << 1 | word << 2 | 0x5555555555555555L; } if (to == length) { assert from < to; // As from is even and to is odd. long word = v.getLong(from / 2, to / 2); word = (word | word << 16) & 0x0000FFFF0000FFFFL; word = (word | word << 8) & 0x00FF00FF00FF00FFL; word = (word | word << 4) & 0x0F0F0F0F0F0F0F0FL; word = (word | word << 2) & 0x3333333333333333L; return (word << 1 | word << 2 | 0x5555555555555555L) & (1L << to - from - 1) - 1; } } return super.getLong(from, to); }
public long longestCommonPrefixLength( final BitVector v ) { final long minLength = Math.min( length(), v.length() ); final long l = minLength - minLength % Long.SIZE; long w0, w1; int i; for( i = 0; i < l; i += Long.SIZE ) { w0 = getLong( i, i + Long.SIZE ); w1 = v.getLong( i, i + Long.SIZE ); if ( w0 != w1 ) return i + Fast.leastSignificantBit( w0 ^ w1 ); } w0 = getLong( i, minLength ); w1 = v.getLong( i, minLength ); if ( w0 != w1 ) return i + Fast.leastSignificantBit( w0 ^ w1 ); return minLength; }
public int compareTo(final BitVector v) { final long minLength = Math.min(length(), v.length()); final long l = minLength - minLength % Long.SIZE; long w0, w1, xor; long i; for(i = 0; i < l; i += Long.SIZE) { w0 = getLong(i, i + Long.SIZE); w1 = v.getLong(i, i + Long.SIZE); xor = w0 ^ w1; if (xor != 0) return (xor & -xor & w0) == 0 ? -1 : 1; } w0 = getLong(i, minLength); w1 = v.getLong(i, minLength); xor = w0 ^ w1; if (xor != 0) return (xor & -xor & w0) == 0 ? -1 : 1; return Long.signum(length() - v.length()); }
public long longestCommonPrefixLength( final BitVector v ) { final long minLength = Math.min( length(), v.length() ); final long l = minLength - minLength % Long.SIZE; long w0, w1; int i; for( i = 0; i < l; i += Long.SIZE ) { w0 = getLong( i, i + Long.SIZE ); w1 = v.getLong( i, i + Long.SIZE ); if ( w0 != w1 ) return i + Fast.leastSignificantBit( w0 ^ w1 ); } w0 = getLong( i, minLength ); w1 = v.getLong( i, minLength ); if ( w0 != w1 ) return i + Fast.leastSignificantBit( w0 ^ w1 ); return minLength; }