Class AbstractBitVector

All Implemented Interfaces:
BitVector, BigList<Boolean>, BooleanBigList, BooleanCollection, BooleanIterable, BooleanStack, Size64, Stack<Boolean>, Comparable<BigList<? extends Boolean>>, Iterable<Boolean>, Collection<Boolean>, RandomAccess
Direct Known Subclasses:
AbstractBitVector.SubBitVector, BooleanListBitVector, LongArrayBitVector, LongBigArrayBitVector

public abstract class AbstractBitVector extends AbstractBooleanBigList implements BitVector
An abstract implementation of a BitVector.

This abstract implementation provides almost all methods: you have to provide just BooleanList.getBoolean(int) and BitVector.length(). No attributes are defined.

Note that the integer-set view provided by asLongSet() is not cached: if you want to cache the result of the first call, you must do your own caching.

Warning: this class has several optimised methods that assume that getLong(long, long) is implemented efficiently when its arguments are multiples of Long.SIZE (see, e.g., the implementation of compareTo(BitVector) and longestCommonPrefixLength(BitVector)). If you want speed up the processing of your own BitVector implementations, just implement getLong(long, long) so that it is fast under the above conditions.

  • Constructor Details

    • AbstractBitVector

      public AbstractBitVector()
  • Method Details

    • ensureRestrictedIndex

      protected void ensureRestrictedIndex(long index)
      Overrides:
      ensureRestrictedIndex in class AbstractBooleanBigList
    • ensureIndex

      protected void ensureIndex(long index)
      Overrides:
      ensureIndex in class AbstractBooleanBigList
    • set

      public void set(int index)
      Implementation Specification:
      This implementation delegates to set(long, boolean).
    • clear

      public void clear(int index)
      Implementation Specification:
      This implementation delegates to set(long, boolean).
    • flip

      public void flip(int index)
      Implementation Specification:
      This implementation delegates to flip(long).
    • set

      public void set(long index)
      Description copied from interface: BitVector
      Sets a bit in this bit vector (optional operation).
      Specified by:
      set in interface BitVector
      Parameters:
      index - the index of a bit.
    • clear

      public void clear(long index)
      Description copied from interface: BitVector
      Clears a bit in this bit vector (optional operation).
      Specified by:
      clear in interface BitVector
      Parameters:
      index - the index of a bit.
    • flip

      public void flip(long index)
      Description copied from interface: BitVector
      Flips a bit in this bit vector (optional operation).
      Specified by:
      flip in interface BitVector
      Parameters:
      index - the index of a bit.
    • fill

      public void fill(boolean value)
      Description copied from interface: BitVector
      Sets all bits this bit vector to the given boolean value (optional operation).
      Specified by:
      fill in interface BitVector
      Parameters:
      value - the value (true or false).
    • fill

      public void fill(int value)
      Description copied from interface: BitVector
      Sets all bits this bit vector to the given integer value (optional operation).
      Specified by:
      fill in interface BitVector
      Parameters:
      value - the value (zero or nonzero).
    • flip

      public void flip()
      Description copied from interface: BitVector
      Flips all bits in this bit vector (optional operation).
      Specified by:
      flip in interface BitVector
    • fill

      public void fill(long from, long to, boolean value)
      Description copied from interface: BitVector
      Fills a range of bits in this bit vector (optional operation).
      Specified by:
      fill in interface BitVector
      Parameters:
      from - the first index (inclusive).
      to - the last index (not inclusive).
      value - the value (true or false).
    • fill

      public void fill(long from, long to, int value)
      Description copied from interface: BitVector
      Clears a range of bits in this bit vector (optional operation).
      Specified by:
      fill in interface BitVector
      Parameters:
      from - the first index (inclusive).
      to - the last index (not inclusive).
      value - the value (zero or nonzero).
    • flip

      public void flip(long from, long to)
      Description copied from interface: BitVector
      Flips a range of bits in this bit vector (optional operation).
      Specified by:
      flip in interface BitVector
      Parameters:
      from - the first index (inclusive).
      to - the last index (not inclusive).
    • getInt

      public int getInt(long index)
      Description copied from interface: BitVector
      Returns the value of the specified bit as an integer.

      This method is a useful synonym for BooleanBigList.getBoolean(long).

      Specified by:
      getInt in interface BitVector
      Parameters:
      index - the index of a bit.
      Returns:
      the value of the specified bit as an integer (0 or 1).
    • getLong

      public long getLong(long from, long to)
      Description copied from interface: BitVector
      Returns the specified bit range as a long.

      Note that bit 0 of the returned long will be bit from of this bit vector.

      Implementations are invited to provide high-speed implementations for the case in which from is a multiple of Long.SIZE and to is from + Long.SIZE (or less, in case the vector length is exceeded). This behaviour make it possible to implement high-speed hashing, copies, etc.

      Specified by:
      getLong in interface BitVector
      Parameters:
      from - the starting bit (inclusive).
      to - the ending bit (exclusive).
      Returns:
      the long value contained in the specified bits.
    • getBoolean

      public boolean getBoolean(int index)
      Implementation Specification:
      This implementation delegates to BooleanBigList.getBoolean(long).
    • removeBoolean

      public boolean removeBoolean(int index)
      Implementation Specification:
      This implementation delegates to removeBoolean(long).
    • set

      public boolean set(int index, boolean value)
      Implementation Specification:
      This implementation delegates to set(long, boolean).
    • add

      public void add(int index, boolean value)
      Implementation Specification:
      This implementation delegates to add(long, boolean).
    • removeBoolean

      public boolean removeBoolean(long index)
      Specified by:
      removeBoolean in interface BooleanBigList
      Overrides:
      removeBoolean in class AbstractBooleanBigList
    • set

      public boolean set(long index, boolean value)
      Specified by:
      set in interface BooleanBigList
      Overrides:
      set in class AbstractBooleanBigList
    • add

      public void add(long index, boolean value)
      Specified by:
      add in interface BooleanBigList
      Overrides:
      add in class AbstractBooleanBigList
    • set

      public void set(long index, int value)
      Description copied from interface: BitVector
      Sets the value of the specified bit as an integer (optional operation).

      This method is a useful synonym for BooleanBigList.set(long, boolean).

      Specified by:
      set in interface BitVector
      Parameters:
      index - the index of a bit.
      value - the new value (any nonzero integer for setting the bit, zero for clearing the bit).
    • add

      public void add(long index, int value)
      Description copied from interface: BitVector
      Adds a bit with specified integer value at the specified index (optional operation).

      This method is a useful synonym for BooleanBigList.add(long, boolean).

      Specified by:
      add in interface BitVector
      Parameters:
      index - the index of a bit.
      value - the value that will be inserted at position index (any nonzero integer for a true bit, zero for a false bit).
    • add

      public boolean add(boolean value)
      Specified by:
      add in interface BooleanCollection
      Overrides:
      add in class AbstractBooleanBigList
    • add

      public void add(int value)
      Description copied from interface: BitVector
      Adds a bit with specified value at the end of this bit vector.

      This method is a useful synonym for BooleanList.add(boolean).

      Specified by:
      add in interface BitVector
      Parameters:
      value - the new value (any nonzero integer for a true bit, zero for a false bit).
    • append

      public BitVector append(long value, int k)
      Description copied from interface: BitVector
      Appends the less significant bits of a long integer to this bit vector.
      Specified by:
      append in interface BitVector
      Parameters:
      value - a value to be appended
      k - the number of less significant bits to be added to this bit vector.
      Returns:
      this bit vector.
    • append

      public BitVector append(BitVector bv)
      Description copied from interface: BitVector
      Appends another bit vector to this bit vector.
      Specified by:
      append in interface BitVector
      Parameters:
      bv - a bit vector to be appended.
      Returns:
      this bit vector.
    • copy

      public BitVector copy()
      Description copied from interface: BitVector
      Returns a copy of this bit vector.
      Specified by:
      copy in interface BitVector
      Returns:
      a copy of this bit vector.
    • copy

      public BitVector copy(long from, long to)
      Description copied from interface: BitVector
      Returns a copy of a part of this bit vector.
      Specified by:
      copy in interface BitVector
      Parameters:
      from - the starting bit, inclusive.
      to - the ending bit, not inclusive.
      Returns:
      a copy of the part of this bit vector going from bit from (inclusive) to bit to (not inclusive)
    • fast

      public BitVector fast()
      Returns an instance of LongArrayBitVector containing a copy of this bit vector.
      Specified by:
      fast in interface BitVector
      Returns:
      an instance of LongArrayBitVector containing a copy of this bit vector.
    • count

      public long count()
      Description copied from interface: BitVector
      Counts the number of bits set to true in this bit vector.
      Specified by:
      count in interface BitVector
      Returns:
      the number of bits set to true in this bit vector.
    • firstOne

      public long firstOne()
      Description copied from interface: BitVector
      Returns the position of the first bit set in this bit vector.
      Specified by:
      firstOne in interface BitVector
      Returns:
      the first bit set, or -1 for a vector of zeroes.
    • lastOne

      public long lastOne()
      Description copied from interface: BitVector
      Returns the position of the last bit set in this bit vector.
      Specified by:
      lastOne in interface BitVector
      Returns:
      the last bit set, or -1 for a vector of zeroes.
    • firstZero

      public long firstZero()
      Description copied from interface: BitVector
      Returns the position of the first bit unset in this bit vector.
      Specified by:
      firstZero in interface BitVector
      Returns:
      the first bit unset, or -1 for a vector of ones.
    • lastZero

      public long lastZero()
      Description copied from interface: BitVector
      Returns the position of the last bit unset in this bit vector.
      Specified by:
      lastZero in interface BitVector
      Returns:
      the last bit unset, or -1 for a vector of ones.
    • nextOne

      public long nextOne(long index)
      Description copied from interface: BitVector
      Returns the position of the first bit set at of after the given position.
      Specified by:
      nextOne in interface BitVector
      Parameters:
      index - a bit position.
      Returns:
      the position of the first bit set at or after position index, or -1 if no such bit exists.
    • previousOne

      public long previousOne(long index)
      Description copied from interface: BitVector
      Returns the position of the first bit set strictly before the given position.
      Specified by:
      previousOne in interface BitVector
      Parameters:
      index - a bit position.
      Returns:
      the position of the first bit set strictly before position index, or -1 if no such bit exists.
    • nextZero

      public long nextZero(long index)
      Description copied from interface: BitVector
      Returns the position of the first bit unset after the given position.
      Specified by:
      nextZero in interface BitVector
      Parameters:
      index - a bit position.
      Returns:
      the first bit unset after position index (inclusive), or -1 if no such bit exists.
    • previousZero

      public long previousZero(long index)
      Description copied from interface: BitVector
      Returns the position of the first bit unset before or at the given position.
      Specified by:
      previousZero in interface BitVector
      Parameters:
      index - a bit position.
      Returns:
      the first bit unset before or at the given position, or -1 if no such bit exists.
    • longestCommonPrefixLength

      public long longestCommonPrefixLength(BitVector v)
      Description copied from interface: BitVector
      Returns the length of the greatest common prefix between this and the specified bit vector.
      Specified by:
      longestCommonPrefixLength in interface BitVector
      Parameters:
      v - a bit vector.
      Returns:
      the length of the greatest common prefix.
    • isPrefix

      public boolean isPrefix(BitVector v)
      Description copied from interface: BitVector
      Returns true if this bit vector is a prefix of the specified bit vector.
      Specified by:
      isPrefix in interface BitVector
      Parameters:
      v - a bit vector.
      Returns:
      true if this bit vector is a prefix of v.
    • isProperPrefix

      public boolean isProperPrefix(BitVector v)
      Description copied from interface: BitVector
      Returns true if this bit vector is a proper prefix of the specified bit vector.
      Specified by:
      isProperPrefix in interface BitVector
      Parameters:
      v - a bit vector.
      Returns:
      true if this bit vector is a proper prefix of v (i.e., it is a prefix but not equal).
    • and

      public BitVector and(BitVector v)
      Description copied from interface: BitVector
      Performs a logical and between this bit vector and another one, leaving the result in this vector.
      Specified by:
      and in interface BitVector
      Parameters:
      v - a bit vector.
      Returns:
      this bit vector.
    • or

      public BitVector or(BitVector v)
      Description copied from interface: BitVector
      Performs a logical or between this bit vector and another one, leaving the result in this bit vector.
      Specified by:
      or in interface BitVector
      Parameters:
      v - a bit vector.
      Returns:
      this bit vector.
    • xor

      public BitVector xor(BitVector v)
      Description copied from interface: BitVector
      Performs a logical xor between this bit vector and another one, leaving the result in this vector.
      Specified by:
      xor in interface BitVector
      Parameters:
      v - a bit vector.
      Returns:
      this bit vector.
    • size

      @Deprecated public int size()
      Deprecated.
      Description copied from interface: BitVector
      Specified by:
      size in interface BigList<Boolean>
      Specified by:
      size in interface BitVector
      Specified by:
      size in interface Collection<Boolean>
      Specified by:
      size in interface Size64
      Overrides:
      size in class AbstractBooleanBigList
    • size64

      public long size64()
      Specified by:
      size64 in interface Size64
      Implementation Specification:
      This implementation just returns BitVector.length().
    • clear

      public void clear()
      Specified by:
      clear in interface Collection<Boolean>
      Overrides:
      clear in class AbstractBooleanBigList
    • replace

      public BitVector replace(BitVector bv)
      Replaces the content of this bit vector with another bit vector.
      Specified by:
      replace in interface BitVector
      Parameters:
      bv - a bit vector.
      Returns:
      this bit vector.
    • equals

      public boolean equals(Object o)
      Specified by:
      equals in interface Collection<Boolean>
      Overrides:
      equals in class AbstractBooleanBigList
    • equals

      public boolean equals(BitVector v, long start, long end)
      Description copied from interface: BitVector
      Checks for equality with a segment of another vector.
      Specified by:
      equals in interface BitVector
      Parameters:
      v - a bit vector.
      start - the starting bit, inclusive.
      end - the ending bit, not inclusive.
      Returns:
      true if this bit vector and v are equal in the range of positions [from..to).
    • hashCode

      public int hashCode()
      Description copied from interface: BitVector
      Returns a hash code for this bit vector.

      Hash codes for bit vectors are defined as follows:

       final long length = length();
       long fullLength = 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);
       (int)((h >>> 32) ^ h);
       

      The last value is the hash code of the bit vector. This hashing is based on shift-add-xor hashing (M.V. Ramakrishna and Justin Zobel, “Performance in practice of string hashing functions”, Proc. of the Fifth International Conference on Database Systems for Advanced Applications, 1997, pages 215−223).

      The returned value is not a high-quality hash such as Jenkins's, but it can be computed very quickly; in any case, 32 bits are too few for a high-quality hash to be used in large-scale applications.

      Important: all bit vector implementations are required to return the value defined here. The simplest way to obtain this result is to subclass AbstractBitVector.

      Specified by:
      hashCode in interface BitVector
      Specified by:
      hashCode in interface Collection<Boolean>
      Overrides:
      hashCode in class AbstractBooleanBigList
      Returns:
      a hash code for this bit vector.
    • bits

      public long[] bits()
      Description copied from interface: BitVector
      Returns the bits in this bit vector as an array of longs, not to be modified.
      Specified by:
      bits in interface BitVector
      Returns:
      an array of longs whose first BitVector.length() bits contain the bits of this bit vector. The array cannot be modified.
    • length

      public BitVector length(long newLength)
      Description copied from interface: BitVector
      Sets the number of bits in this bit vector.

      It is expected that this method will try to allocate exactly the necessary space.

      If the argument fits an integer, this method has the same side effects of BooleanList.size(int). In any case, this method has the same side effects of BigList.size(long), but it is preferred, as it has the advantage of returning this bit vector, thus making it possible to chain methods.

      Specified by:
      length in interface BitVector
      Parameters:
      newLength - the new length in bits for this bit vector.
      Returns:
      this bit vector.
    • size

      public void size(long newSize)
      Specified by:
      size in interface BigList<Boolean>
      Overrides:
      size in class AbstractBooleanBigList
    • asLongSet

      public LongSortedSet asLongSet()
      Description copied from interface: BitVector
      Returns a view of this bit vector as a sorted set of long integers.

      More formally, this bit vector is infinitely extended to the left with zeros (e.g., all bits beyond BitVector.length(long) are considered zeroes). The resulting infinite string is interpreted as the characteristic function of a set of integers.

      Note that, in particular, the resulting string representation is exactly that of a BitSet.

      Specified by:
      asLongSet in interface BitVector
      Returns:
      a view of this bit vector as a sorted set of long integers.
    • asLongBigList

      public LongBigList asLongBigList(int width)
      Description copied from interface: BitVector
      Returns a view of this bit vector as a list of nonnegative integers of specified width.

      More formally, getLong(p) will return the nonnegative integer defined by the bits starting at p * width (bit 0, inclusive) and ending at (p + 1) * width (bit width − 1, exclusive).

      Specified by:
      asLongBigList in interface BitVector
      Parameters:
      width - a bit width.
      Returns:
      a view of this bit vector as a list of nonnegative integers of specified width.
    • subVector

      public BitVector subVector(long from, long to)
      Description copied from interface: BitVector
      Returns a subvector view specified by initial and final index.

      The object returned by this method is a bit vector representing a view of this bit vector restricted to the given indices. Changes to the subvector will be reflected in the main vector.

      Specified by:
      subVector in interface BitVector
      Parameters:
      from - the first index (inclusive).
      to - the last index (not inclusive).
      Returns:
      a subvector view specified by initial and final index.
    • subVector

      public BitVector subVector(long from)
      Description copied from interface: BitVector
      Returns a subvector view specified by initial index and running up to the end of this bit vector.
      Specified by:
      subVector in interface BitVector
      Parameters:
      from - the first index (inclusive).
      Returns:
      a subvector view specified by initial index and running up to the end of this bit vector.
      See Also:
    • compareTo

      public int compareTo(BigList<? extends Boolean> list)
      Specified by:
      compareTo in interface Comparable<BigList<? extends Boolean>>
      Overrides:
      compareTo in class AbstractBooleanBigList
    • compareTo

      public int compareTo(BitVector v)
      Compares lexicographically this bit vector with another bit vector.
      Parameters:
      v - another bit vector.
      Returns:
      -1, 0, or 1, depending on the lexicographical order of the two vectors.
      Implementation Notes:
      This method compares the two bit vectors by extracting a 64-bit word at a time using BitVector.getLong(long, long).
    • toString

      public String toString()
      Returns a string representation of this vector.

      Note that this string representation shows the bit of index 0 at the leftmost position.

      Overrides:
      toString in class AbstractBooleanBigList
      Returns:
      a string representation of this vector, with the bit of index 0 on the left.