parent
6be9684df4
commit
f8a3eb7320
@ -0,0 +1,56 @@
|
||||
package io.nayuki.fastqrcodegen;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
|
||||
final class BitBuffer {
|
||||
|
||||
/*---- Fields ----*/
|
||||
|
||||
private int[] data;
|
||||
|
||||
private int bitLength;
|
||||
|
||||
|
||||
|
||||
/*---- Constructors ----*/
|
||||
|
||||
public BitBuffer() {
|
||||
data = new int[64];
|
||||
bitLength = 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*---- Methods ----*/
|
||||
|
||||
public int getBit(int index) {
|
||||
if (index < 0 || index >= bitLength)
|
||||
throw new IndexOutOfBoundsException();
|
||||
return (data[index >>> 5] >>> ~index) & 1;
|
||||
}
|
||||
|
||||
|
||||
public void appendBits(int val, int len) {
|
||||
if (len < 0 || len > 31 || val >>> len != 0)
|
||||
throw new IllegalArgumentException("Value out of range");
|
||||
|
||||
if (bitLength + len + 1 > data.length << 5)
|
||||
data = Arrays.copyOf(data, data.length * 2);
|
||||
assert bitLength + len <= data.length << 5;
|
||||
|
||||
int remain = 32 - (bitLength & 0x1F);
|
||||
assert 1 <= remain && remain <= 32;
|
||||
if (remain < len) {
|
||||
data[bitLength >>> 5] |= val >>> (len - remain);
|
||||
bitLength += remain;
|
||||
assert (bitLength & 0x1F) == 0;
|
||||
len -= remain;
|
||||
val &= (1 << len) - 1;
|
||||
remain = 32;
|
||||
}
|
||||
data[bitLength >>> 5] |= val << (remain - len);
|
||||
bitLength += len;
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in new issue