Class InputBitStream

java.lang.Object
it.unimi.dsi.io.InputBitStream
All Implemented Interfaces:
BooleanIterator, Closeable, Flushable, AutoCloseable, Iterator<Boolean>, PrimitiveIterator<Boolean,BooleanConsumer>
Direct Known Subclasses:
DebugInputBitStream

public class InputBitStream extends Object implements BooleanIterator, Flushable, Closeable
Bit-level input stream.

This class wraps any InputStream so that you can treat it as bit stream. Constructors and methods closely resemble those of InputStream. Data can be read from such a stream in several ways: reading a (long) natural number in fixed-width, unary, γ, shifted γ, δ, ζ and (skewed) Golomb coding, or reading a number of bits that will be stored in a vector of bytes. There is limited support for mark(int)/reset() operations.

This class can also wrap a byte array; this is much more lightweight than wrapping a FastByteArrayInputStream wrapping the array. Overflowing the array will cause an EOFException.

Note that when reading using a vector of bytes bits are read in the stream format (see OutputBitStream): the first bit is bit 7 of the first byte, the eighth bit is bit 0 of the first byte, the ninth bit is bit 7 of the second byte and so on. When reading natural numbers using some coding, instead, they are stored in the standard way, that is, in the lower bits.

Additional features:

  • This class provides an internal buffer. By setting a buffer of length 0 at creation time, you can actually bypass the buffering system: Note, however, that several classes providing buffering have synchronised methods, so using a wrapper instead of the internal buffer is likely to lead to a performance drop.
  • To work around the schizophrenic relationship between streams and random access files in java.io, this class provides a flush() method that resets the internal state. At this point, you can safely reposition the underlying stream and read again afterwards. For instance, this is safe and will perform as expected:
     FileInputStream fis = new FileInputStream(...);
     InputBitStream ibs = new InputBitStream(fis);
     ... read operations on ibs ...
     ibs.flush();
     fis.getChannel().position(...);
     ... other read operations on ibs ...
     

    As a commodity, an instance of this class will try to cast the underlying byte stream to a RepositionableStream and to fetch by reflection the FileChannel underlying the given input stream, in this order. If either reference can be successfully fetched, you can use directly the position() method with argument pos with the same semantics of a flush(), followed by a call to position(pos / 8) (where the latter method belongs either to the underlying stream or to its underlying file channel), followed by a skip(pos % 8). However, since the reflective checks are quite heavy they can be disabled using a suitable constructor.

  • Finally, this class implements partially the interface of a boolean iterator. More precisely, nextBoolean() will return the same bit as readBit(), and also the same exceptions, whereas hasNext() will always return true: you must be prepared to catch a RuntimeException wrapping an IOException in case the file ends. It is very difficult to implement completely an eager operator using a input-stream based model.

This class is not synchronised. If multiple threads access an instance of this class concurrently, they must be synchronised externally.

Since:
0.1
Author:
Sebastiano Vigna
See Also:
  • Nested Class Summary

    Nested classes/interfaces inherited from interface java.util.PrimitiveIterator

    PrimitiveIterator.OfDouble, PrimitiveIterator.OfInt, PrimitiveIterator.OfLong
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    protected int
    Current number of bytes available in the byte buffer.
    protected byte[]
    The stream buffer.
    static final int
    The default size of the byte buffer in bytes (8Ki).
    static final int[]
     
    protected final FileChannel
    The cached file channel underlying is, if any.
    protected int
    Current number of bits in the bit buffer (stored low).
    static final int[]
     
    protected final InputStream
    The underlying InputStream.
    protected int
    Current position in the byte buffer.
    protected long
    Current position of the first byte in the byte buffer.
    protected final RepositionableStream
    is cast to a positionable stream, if possible.
    static final int[]
     
    protected final boolean
    True if we are wrapping an array.
    static final int[]
     
  • Constructor Summary

    Constructors
    Modifier
    Constructor
    Description
    protected
    This (non-public) constructor exists just to provide fake initialisation for classes such as DebugInputBitStream.
     
    InputBitStream(byte[] a)
    Creates a new input bit stream wrapping a given byte array.
     
    Creates a new input bit stream reading from a file.
     
    Creates a new input bit stream wrapping a given file input stream using a buffer of size DEFAULT_BUFFER_SIZE.
     
    InputBitStream(FileInputStream is, int bufSize)
    Creates a new input bit stream wrapping a given file input stream with a specified buffer size.
     
    InputBitStream(File file, int bufSize)
    Creates a new input bit stream reading from a file.
     
    Creates a new input bit stream wrapping a given input stream using a buffer of size DEFAULT_BUFFER_SIZE.
     
    InputBitStream(InputStream is, boolean testForPosition)
    Creates a new input bit stream wrapping a given input stream using a buffer of size DEFAULT_BUFFER_SIZE.
     
    InputBitStream(InputStream is, int bufSize)
    Creates a new input bit stream wrapping a given input stream with a specified buffer size.
     
    InputBitStream(InputStream is, int bufSize, boolean testForPosition)
    Creates a new input bit stream wrapping a given input stream with a specified buffer size.
     
    Creates a new input bit stream reading from a file.
     
    InputBitStream(String name, int bufSize)
    Creates a new input bit stream reading from a file.
  • Method Summary

    Modifier and Type
    Method
    Description
    void
    Aligns the stream.
    long
    Returns the number of bits that can be read (or skipped over) from this bit stream without blocking by the next caller of a method.
    static boolean
    checkLength(String resource, int[] array, String resouceFullPath)
     
    void
    Closes the bit stream.
    void
    copyTo(OutputBitStream obs, long length)
    Copies a given number of bits from this input bit stream into a given output bit stream.
    void
    Flushes the bit stream.
    boolean
     
    void
    mark(int readLimit)
    Marks the current position in this input stream.
    boolean
    Tests if this stream supports the mark(int) and reset() methods.
    boolean
     
    long
    Returns this stream bit position.
    void
    position(long position)
    Sets this stream bit position, if it is based on a RepositionableStream or on a FileChannel.
    void
    read(byte[] bits, int len)
    Reads a sequence of bits.
    int
    Reads a bit.
    long
    Returns the number of bits read from this bit stream.
    void
    readBits(long readBits)
    Sets the number of bits read from this bit stream.
    int
    Reads a natural number in δ coding.
    void
    readDeltas(int[] a, int count)
    Reads a given amount of δ-coded natural numbers.
    int
    Reads a natural number in γ coding.
    void
    readGammas(int[] a, int count)
    Reads a given amount of γ-coded natural numbers.
    int
    readGolomb(int b)
    Reads a natural number in Golomb coding.
    int
    readGolomb(int b, int log2b)
    Reads a natural number in Golomb coding.
    int
    readInt(int len)
    Reads a fixed number of bits into an integer.
    long
    readLong(int len)
    Reads a fixed number of bits into a long.
    long
    Reads a long natural number in δ coding.
    long
    Reads a long natural number in γ coding.
    long
    Reads a long natural number in Golomb coding.
    long
    readLongGolomb(long b, int log2b)
    Reads a long natural number in Golomb coding.
    long
    Reads a long natural number in a limited range using a minimal binary coding.
    long
    readLongMinimalBinary(long b, int log2b)
    Reads a long natural number in a limited range using a minimal binary coding.
    long
    Reads a long natural number in variable-length nibble coding.
    long
    Reads a natural number in shifted γ coding.
    long
    Reads a long natural number in skewed Golomb coding.
    long
    Reads a long natural number in unary coding.
    long
    readLongZeta(int k)
    Reads a long natural number in ζ coding.
    int
    Reads a natural number in a limited range using a minimal binary coding.
    int
    readMinimalBinary(int b, int log2b)
    Reads a natural number in a limited range using a minimal binary coding.
    int
    Reads a natural number in variable-length nibble coding.
    int
    Reads a natural number in shifted γ coding.
    void
    readShiftedGammas(int[] a, int count)
    Reads a given amount of shifted-γ-coded natural numbers.
    int
    Reads a natural number in skewed Golomb coding.
    int
    Reads a natural number in unary coding.
    int
    readZeta(int k)
    Reads a natural number in ζ coding.
    void
    readZetas(int k, int[] a, int count)
    Reads a given amount of γ-coded natural numbers.
    void
    Repositions this bit stream to the position at the time the mark(int) method was last called.
    int
    skip(int n)
    Deprecated.
    This method is simply an expensive, try/catch-surrounded version of skip(long) that is made necessary by the interface by BooleanIterator.
    long
    skip(long n)
    Skips the given number of bits.
    void
    skipDeltas(int n)
    Skips a given amount of δ-coded natural numbers.
    void
    skipDeltas(long n)
    Skips a given amount of δ-coded natural numbers.
    void
    skipGammas(int n)
    Skips a given amount of γ-coded natural numbers.
    void
    skipGammas(long n)
    Skips a given amount of γ-coded natural numbers.
    void
    Skips a given amount of shifted-γ-coded natural numbers.
    void
    Skips a given amount of shifted-γ-coded natural numbers.
    void
    skipZetas(int k, int n)
    Skips a given amount of ζ-coded natural numbers.
    void
    skipZetas(int k, long n)
    Skips a given amount of ζ-coded natural numbers.

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

    Methods inherited from interface it.unimi.dsi.fastutil.booleans.BooleanIterator

    forEachRemaining, forEachRemaining, next

    Methods inherited from interface java.util.Iterator

    remove
  • Field Details

    • GAMMA

      public static final int[] GAMMA
    • DELTA

      public static final int[] DELTA
    • ZETA_3

      public static final int[] ZETA_3
    • SHIFTED_GAMMA

      public static final int[] SHIFTED_GAMMA
    • DEFAULT_BUFFER_SIZE

      public static final int DEFAULT_BUFFER_SIZE
      The default size of the byte buffer in bytes (8Ki).
      See Also:
    • is

      protected final InputStream is
      The underlying InputStream.
    • fileChannel

      protected final FileChannel fileChannel
      The cached file channel underlying is, if any.
    • repositionableStream

      protected final RepositionableStream repositionableStream
      is cast to a positionable stream, if possible.
    • wrapping

      protected final boolean wrapping
      True if we are wrapping an array.
    • buffer

      protected byte[] buffer
      The stream buffer.
    • fill

      protected int fill
      Current number of bits in the bit buffer (stored low).
    • pos

      protected int pos
      Current position in the byte buffer.
    • avail

      protected int avail
      Current number of bytes available in the byte buffer.
    • position

      protected long position
      Current position of the first byte in the byte buffer.
  • Constructor Details

    • InputBitStream

      protected InputBitStream()
      This (non-public) constructor exists just to provide fake initialisation for classes such as DebugInputBitStream.
    • InputBitStream

      public InputBitStream(InputStream is)
      Creates a new input bit stream wrapping a given input stream using a buffer of size DEFAULT_BUFFER_SIZE.

      This constructor performs the reflective tests that are necessary to support position(long).

      Parameters:
      is - the input stream to wrap.
    • InputBitStream

      public InputBitStream(InputStream is, boolean testForPosition)
      Creates a new input bit stream wrapping a given input stream using a buffer of size DEFAULT_BUFFER_SIZE.
      Parameters:
      is - the input stream to wrap.
      testForPosition - if false, the reflective test that is necessary to support position(long) in case is does not implement RepositionableStream will not be performed.
    • InputBitStream

      public InputBitStream(InputStream is, int bufSize)
      Creates a new input bit stream wrapping a given input stream with a specified buffer size.

      This constructor performs the reflective tests that are necessary to support position(long).

      Parameters:
      is - the input stream to wrap.
      bufSize - the size in byte of the buffer; it may be 0, denoting no buffering.
    • InputBitStream

      public InputBitStream(InputStream is, int bufSize, boolean testForPosition)
      Creates a new input bit stream wrapping a given input stream with a specified buffer size.
      Parameters:
      is - the input stream to wrap.
      bufSize - the size in byte of the buffer; it may be 0, denoting no buffering.
      testForPosition - if false, the reflective test that is necessary to support position(long) in case is does not implement RepositionableStream will not be performed.
    • InputBitStream

      public InputBitStream(FileInputStream is)
      Creates a new input bit stream wrapping a given file input stream using a buffer of size DEFAULT_BUFFER_SIZE.

      This constructor invokes directly FileInputStream.getChannel() to support position(long).

      Parameters:
      is - the file input stream to wrap.
    • InputBitStream

      public InputBitStream(FileInputStream is, int bufSize)
      Creates a new input bit stream wrapping a given file input stream with a specified buffer size.

      This constructor invokes directly FileInputStream.getChannel() to support position(long).

      Parameters:
      is - the file input stream to wrap.
      bufSize - the size in byte of the buffer; it may be 0, denoting no buffering.
    • InputBitStream

      public InputBitStream(byte[] a)
      Creates a new input bit stream wrapping a given byte array.
      Parameters:
      a - the byte array to wrap.
    • InputBitStream

      public InputBitStream(String name, int bufSize) throws FileNotFoundException
      Creates a new input bit stream reading from a file.

      This constructor invokes directly FileInputStream.getChannel() to support position(long).

      Parameters:
      name - the name of the file.
      bufSize - the size in byte of the buffer; it may be 0, denoting no buffering.
      Throws:
      FileNotFoundException
    • InputBitStream

      public InputBitStream(String name) throws FileNotFoundException
      Creates a new input bit stream reading from a file.

      This constructor invokes directly FileInputStream.getChannel() to support position(long).

      Parameters:
      name - the name of the file.
      Throws:
      FileNotFoundException
    • InputBitStream

      public InputBitStream(File file) throws FileNotFoundException
      Creates a new input bit stream reading from a file.

      This constructor invokes directly FileInputStream.getChannel() to support position(long).

      Parameters:
      file - the file.
      Throws:
      FileNotFoundException
    • InputBitStream

      public InputBitStream(File file, int bufSize) throws FileNotFoundException
      Creates a new input bit stream reading from a file.

      This constructor invokes directly FileInputStream.getChannel() to support position(long).

      Parameters:
      file - the file.
      bufSize - the size in byte of the buffer; it may be 0, denoting no buffering.
      Throws:
      FileNotFoundException
  • Method Details

    • checkLength

      public static boolean checkLength(String resource, int[] array, String resouceFullPath)
    • flush

      public void flush()
      Flushes the bit stream. All state information associated with the stream is reset. This includes bytes prefetched from the stream, bits in the bit buffer and unget'd bits.

      This method is provided so that users of this class can easily wrap repositionable streams (for instance, file-based streams, which can be repositioned using the underlying FileChannel). It is guaranteed that after calling this method the underlying stream can be repositioned, and that the next read will draw data from the stream.

      Specified by:
      flush in interface Flushable
    • close

      public void close() throws IOException
      Closes the bit stream. All resources associated with the stream are released.
      Specified by:
      close in interface AutoCloseable
      Specified by:
      close in interface Closeable
      Throws:
      IOException
    • available

      public long available() throws IOException
      Returns the number of bits that can be read (or skipped over) from this bit stream without blocking by the next caller of a method.
      Returns:
      the number of bits that can be read from this bit stream without blocking.
      Throws:
      IOException
    • readBits

      public long readBits()
      Returns the number of bits read from this bit stream.
      Returns:
      the number of bits read so far.
    • readBits

      public void readBits(long readBits)
      Sets the number of bits read from this bit stream.

      This method is provided so that, for instance, the user can reset via readBits(0) the read-bits count after a flush().

      Parameters:
      readBits - the new value for the number of bits read so far.
    • align

      public void align()
      Aligns the stream. After a call to this function, the stream is byte aligned. Bits that have been read to align are discarded.
    • read

      public void read(byte[] bits, int len) throws IOException
      Reads a sequence of bits. Bits will be read in the natural way: the first bit is bit 7 of the first byte, the eightth bit is bit 0 of the first byte, the ninth bit is bit 7 of the second byte and so on.
      Parameters:
      bits - an array of bytes to store the result.
      len - the number of bits to read.
      Throws:
      IOException
    • readBit

      public int readBit() throws IOException
      Reads a bit.
      Returns:
      the next bit from the stream.
      Throws:
      IOException
    • readInt

      public int readInt(int len) throws IOException
      Reads a fixed number of bits into an integer.
      Parameters:
      len - a bit length.
      Returns:
      an integer whose lower len bits are taken from the stream; the rest is zeroed.
      Throws:
      IOException
    • readLong

      public long readLong(int len) throws IOException
      Reads a fixed number of bits into a long.
      Parameters:
      len - a bit length.
      Returns:
      a long whose lower len bits are taken from the stream; the rest is zeroed.
      Throws:
      IOException
    • skip

      public long skip(long n) throws IOException
      Skips the given number of bits.
      Parameters:
      n - the number of bits to skip.
      Returns:
      the actual number of skipped bits.
      Throws:
      IOException
    • position

      public void position(long position) throws IOException
      Sets this stream bit position, if it is based on a RepositionableStream or on a FileChannel.

      Given an underlying stream that implements RepositionableStream or that can provide a FileChannel via the getChannel() method, a call to this method has the same semantics of a flush(), followed by a call to position(position / 8) on the byte stream, followed by a skip(position % 8).

      Note that this method does not change the value returned by readBits().

      Parameters:
      position - the new position expressed as a bit offset.
      Throws:
      UnsupportedOperationException - if the underlying byte stream does not implement RepositionableStream or if the channel it returns is not a FileChannel.
      IOException
      See Also:
    • position

      public long position()
      Returns this stream bit position.
      Returns:
      this stream bit position.
    • markSupported

      public boolean markSupported()
      Tests if this stream supports the mark(int) and reset() methods.

      This method will just delegate the test to the underlying InputStream.

      Returns:
      whether this stream supports mark(int)/reset().
    • mark

      public void mark(int readLimit) throws IOException
      Marks the current position in this input stream. A subsequent call to the reset() method repositions this stream at the last marked position so that subsequent reads re-read the same bits.

      This method will just delegate the mark to the underlying InputStream. Moreover, it will throw an exception if you try to mark outsite byte boundaries.

      Parameters:
      readLimit - the maximum limit of bytes that can be read before the mark position becomes invalid.
      Throws:
      IOException - if you try to mark outside byte boundaries.
    • reset

      public void reset() throws IOException
      Repositions this bit stream to the position at the time the mark(int) method was last called.

      This method will just flush the stream and delegate the reset to the underlying InputStream.

      Throws:
      IOException
    • readUnary

      public int readUnary() throws IOException
      Reads a natural number in unary coding.
      Returns:
      the next unary-encoded natural number.
      Throws:
      IOException
      See Also:
    • readLongUnary

      public long readLongUnary() throws IOException
      Reads a long natural number in unary coding. Note that by unary coding we mean that 1 encodes 0, 01 encodes 1 and so on.
      Returns:
      the next unary-encoded long natural number.
      Throws:
      IOException
      See Also:
    • readGamma

      public int readGamma() throws IOException
      Reads a natural number in γ coding.
      Returns:
      the next γ-encoded natural number.
      Throws:
      IOException
      See Also:
    • readLongGamma

      public long readLongGamma() throws IOException
      Reads a long natural number in γ coding.
      Returns:
      the next γ-encoded long natural number.
      Throws:
      IOException
      See Also:
    • skipGammas

      public void skipGammas(long n) throws IOException
      Skips a given amount of γ-coded natural numbers.

      This method should be significantly quicker than iterating n times on readGamma() or readLongGamma(), as precomputed tables are used directly, so the number of method calls is greatly reduced, and the result is discarded, so skip(long) can be invoked instead of more specific decoding methods.

      Parameters:
      n - the number of γ-coded natural numbers to be skipped.
      Throws:
      IOException
      See Also:
    • skipGammas

      public void skipGammas(int n) throws IOException
      Skips a given amount of γ-coded natural numbers.

      This method should be significantly quicker than iterating n times on readGamma() or readLongGamma(), as precomputed tables are used directly, so the number of method calls is greatly reduced, and the result is discarded, so skip(long) can be invoked instead of more specific decoding methods.

      Parameters:
      n - the number of γ-coded natural numbers to be skipped.
      Throws:
      IOException
      See Also:
    • readGammas

      public void readGammas(int[] a, int count) throws IOException
      Reads a given amount of γ-coded natural numbers.

      This method should be significantly quicker than iterating n times on readGamma(), as precomputed tables are used directly, so the number of method calls is greatly reduced.

      Parameters:
      a - an array of at least count integers where the result will be written starting at the first position.
      count - the number of γ-coded natural numbers to be read.
      Throws:
      IOException
      See Also:
    • readShiftedGamma

      public int readShiftedGamma() throws IOException
      Reads a natural number in shifted γ coding.
      Returns:
      the next shifted-γ–encoded natural number.
      Throws:
      IOException
      See Also:
    • readLongShiftedGamma

      public long readLongShiftedGamma() throws IOException
      Reads a natural number in shifted γ coding.
      Returns:
      the next shifted-γ–encoded natural number.
      Throws:
      IOException
      See Also:
    • skipShiftedGammas

      public void skipShiftedGammas(long n) throws IOException
      Skips a given amount of shifted-γ-coded natural numbers.

      This method should be significantly quicker than iterating n times on readShiftedGamma() or readLongShiftedGamma(), as precomputed tables are used directly, so the number of method calls is greatly reduced, and the result is discarded, so skip(long) can be invoked instead of more specific decoding methods.

      Parameters:
      n - the number of shifted-γ-coded natural numbers to be skipped.
      Throws:
      IOException
      See Also:
    • skipShiftedGammas

      public void skipShiftedGammas(int n) throws IOException
      Skips a given amount of shifted-γ-coded natural numbers.

      This method should be significantly quicker than iterating n times on readShiftedGamma() or readLongShiftedGamma(), as precomputed tables are used directly, so the number of method calls is greatly reduced, and the result is discarded, so skip(long) can be invoked instead of more specific decoding methods.

      Parameters:
      n - the number of shifted-γ-coded natural numbers to be skipped.
      Throws:
      IOException
      See Also:
    • readShiftedGammas

      public void readShiftedGammas(int[] a, int count) throws IOException
      Reads a given amount of shifted-γ-coded natural numbers.

      This method should be significantly quicker than iterating n times on readShiftedGamma(), as precomputed tables are used directly, so the number of method calls is greatly reduced.

      Parameters:
      a - an array of at least count integers where the result will be written starting at the first position.
      count - the number of shifted-γ-coded natural numbers to be read.
      Throws:
      IOException
      See Also:
    • readDelta

      public int readDelta() throws IOException
      Reads a natural number in δ coding.
      Returns:
      the next δ-encoded natural number.
      Throws:
      IOException
      See Also:
    • readLongDelta

      public long readLongDelta() throws IOException
      Reads a long natural number in δ coding.
      Returns:
      the next δ-encoded long natural number.
      Throws:
      IOException
      See Also:
    • skipDeltas

      public void skipDeltas(long n) throws IOException
      Skips a given amount of δ-coded natural numbers.

      This method should be significantly quicker than iterating n times on readDelta() or readLongDelta(), as precomputed tables are used directly, so the number of method calls is greatly reduced, and the result is discarded, so skip(long) can be invoked instead of more specific decoding methods.

      Parameters:
      n - the number of δ-coded natural numbers to be skipped.
      Throws:
      IOException
      See Also:
    • skipDeltas

      public void skipDeltas(int n) throws IOException
      Skips a given amount of δ-coded natural numbers.

      This method should be significantly quicker than iterating n times on readDelta() or readLongDelta(), as precomputed tables are used directly, so the number of method calls is greatly reduced, and the result is discarded, so skip(long) can be invoked instead of more specific decoding methods.

      Parameters:
      n - the number of δ-coded natural numbers to be skipped.
      Throws:
      IOException
      See Also:
    • readDeltas

      public void readDeltas(int[] a, int count) throws IOException
      Reads a given amount of δ-coded natural numbers.

      This method should be significantly quicker than iterating n times on readDelta(), as precomputed tables are used directly, so the number of method calls is greatly reduced.

      Parameters:
      a - an array of at least count integers where the result will be written starting at the first position.
      count - the number of δ-coded natural numbers to be read.
      Throws:
      IOException
      See Also:
    • readMinimalBinary

      public int readMinimalBinary(int b) throws IOException
      Reads a natural number in a limited range using a minimal binary coding.
      Parameters:
      b - a strict upper bound.
      Returns:
      the next minimally binary encoded natural number.
      Throws:
      IllegalArgumentException - if you try to read a negative number or use a nonpositive base.
      IOException
      See Also:
    • readMinimalBinary

      public int readMinimalBinary(int b, int log2b) throws IOException
      Reads a natural number in a limited range using a minimal binary coding. This method is faster than readMinimalBinary(int) because it does not have to compute log2b.
      Parameters:
      b - a strict upper bound.
      log2b - the floor of the base-2 logarithm of the bound.
      Returns:
      the next minimally binary encoded natural number.
      Throws:
      IllegalArgumentException - if you try to read a negative number or use a nonpositive base.
      IOException
      See Also:
    • readLongMinimalBinary

      public long readLongMinimalBinary(long b) throws IOException
      Reads a long natural number in a limited range using a minimal binary coding.
      Parameters:
      b - a strict upper bound.
      Returns:
      the next minimally binary encoded long natural number.
      Throws:
      IllegalArgumentException - if you try to read a negative number or use a nonpositive base.
      IOException
      See Also:
    • readLongMinimalBinary

      public long readLongMinimalBinary(long b, int log2b) throws IOException
      Reads a long natural number in a limited range using a minimal binary coding. This method is faster than readLongMinimalBinary(long) because it does not have to compute log2b.
      Parameters:
      b - a strict upper bound.
      log2b - the floor of the base-2 logarithm of the bound.
      Returns:
      the next minimally binary encoded long natural number.
      Throws:
      IllegalArgumentException - if you try to read a negative number or use a nonpositive base.
      IOException
      See Also:
    • readGolomb

      public int readGolomb(int b) throws IOException
      Reads a natural number in Golomb coding.

      This method implements also the case in which b is 0: in this case, nothing will be read, and 0 will be returned.

      Parameters:
      b - the modulus for the coding.
      Returns:
      the next Golomb-encoded natural number.
      Throws:
      IllegalArgumentException - if you use a nonpositive modulus.
      IOException
      See Also:
    • readGolomb

      public int readGolomb(int b, int log2b) throws IOException
      Reads a natural number in Golomb coding. This method is faster than readGolomb(int) because it does not have to compute log2b.

      This method implements also the case in which b is 0: in this case, nothing will be read, and 0 will be returned.

      Parameters:
      b - the modulus for the coding.
      log2b - the floor of the base-2 logarithm of the coding modulus.
      Returns:
      the next Golomb-encoded natural number.
      Throws:
      IllegalArgumentException - if you use a nonpositive modulus.
      IOException
      See Also:
    • readLongGolomb

      public long readLongGolomb(long b) throws IOException
      Reads a long natural number in Golomb coding.

      This method implements also the case in which b is 0: in this case, nothing will be read, and 0 will be returned.

      Parameters:
      b - the modulus for the coding.
      Returns:
      the next Golomb-encoded long natural number.
      Throws:
      IllegalArgumentException - if you use a nonpositive modulus.
      IOException
      See Also:
    • readLongGolomb

      public long readLongGolomb(long b, int log2b) throws IOException
      Reads a long natural number in Golomb coding. This method is faster than readLongGolomb(long) because it does not have to compute log2b.

      This method implements also the case in which b is 0: in this case, nothing will be read, and 0 will be returned.

      Parameters:
      b - the modulus for the coding.
      log2b - the floor of the base-2 logarithm of the coding modulus.
      Returns:
      the next Golomb-encoded long natural number.
      Throws:
      IllegalArgumentException - if you use a nonpositive modulus.
      IOException
      See Also:
    • readSkewedGolomb

      public int readSkewedGolomb(int b) throws IOException
      Reads a natural number in skewed Golomb coding.

      This method implements also the case in which b is 0: in this case, nothing will be read, and 0 will be returned.

      Parameters:
      b - the modulus for the coding.
      Returns:
      the next skewed Golomb-encoded natural number.
      Throws:
      IllegalArgumentException - if you use a negative modulus.
      IOException
      See Also:
    • readLongSkewedGolomb

      public long readLongSkewedGolomb(long b) throws IOException
      Reads a long natural number in skewed Golomb coding.

      This method implements also the case in which b is 0: in this case, nothing will be read, and 0 will be returned.

      Parameters:
      b - the modulus for the coding.
      Returns:
      the next skewed Golomb-encoded long natural number.
      Throws:
      IllegalArgumentException - if you use a negative modulus.
      IOException
      See Also:
    • readZeta

      public int readZeta(int k) throws IOException
      Reads a natural number in ζ coding.
      Parameters:
      k - the shrinking factor.
      Returns:
      the next ζ-encoded natural number.
      Throws:
      IllegalArgumentException - if you use a nonpositive shrinking factor.
      IOException
      See Also:
    • readLongZeta

      public long readLongZeta(int k) throws IOException
      Reads a long natural number in ζ coding.
      Parameters:
      k - the shrinking factor.
      Returns:
      the next ζ-encoded long natural number.
      Throws:
      IllegalArgumentException - if you use a nonpositive shrinking factor.
      IOException
      See Also:
    • skipZetas

      public void skipZetas(int k, long n) throws IOException
      Skips a given amount of ζ-coded natural numbers.

      This method should be significantly quicker than iterating n times on readZeta(int) or readLongZeta(int), as precomputed tables are used directly, so the number of method calls is greatly reduced, and the result is discarded, so skip(long) can be invoked instead of more specific decoding methods.

      Parameters:
      k - the shrinking factor.
      n - the number of ζ-coded natural numbers to be skipped.
      Throws:
      IOException
      See Also:
    • skipZetas

      public void skipZetas(int k, int n) throws IOException
      Skips a given amount of ζ-coded natural numbers.

      This method should be significantly quicker than iterating n times on readZeta(int) or readLongZeta(int), as precomputed tables are used directly, so the number of method calls is greatly reduced, and the result is discarded, so skip(long) can be invoked instead of more specific decoding methods.

      Parameters:
      k - the shrinking factor.
      n - the number of ζ-coded natural numbers to be skipped.
      Throws:
      IOException
      See Also:
    • readZetas

      public void readZetas(int k, int[] a, int count) throws IOException
      Reads a given amount of γ-coded natural numbers.

      This method should be significantly quicker than iterating n times on readGamma(), as precomputed tables are used directly, so the number of method calls is greatly reduced.

      Parameters:
      k - the shrinking factor.
      a - an array of at least count integers where the result will be written starting at the first position.
      count - the number of ζ-coded natural numbers to be read.
      Throws:
      IOException
      See Also:
    • readNibble

      public int readNibble() throws IOException
      Reads a natural number in variable-length nibble coding.
      Returns:
      the next variable-length nibble-encoded natural number.
      Throws:
      IOException
      See Also:
    • readLongNibble

      public long readLongNibble() throws IOException
      Reads a long natural number in variable-length nibble coding.
      Returns:
      the next variable-length nibble-encoded long natural number.
      Throws:
      IOException
      See Also:
    • hasNext

      public boolean hasNext()
      Specified by:
      hasNext in interface Iterator<Boolean>
    • nextBoolean

      public boolean nextBoolean()
      Specified by:
      nextBoolean in interface BooleanIterator
    • skip

      @Deprecated public int skip(int n)
      Deprecated.
      This method is simply an expensive, try/catch-surrounded version of skip(long) that is made necessary by the interface by BooleanIterator.
      Skips over the given number of bits.
      Specified by:
      skip in interface BooleanIterator
      Parameters:
      n - the number of bits to skip.
      Returns:
      the number of bits actually skipped.
    • copyTo

      public void copyTo(OutputBitStream obs, long length) throws IOException
      Copies a given number of bits from this input bit stream into a given output bit stream.
      Parameters:
      obs - an output bit stream.
      length - the number of bits to copy.
      Throws:
      EOFException - if there are not enough bits to copy.
      IOException