1
0
mirror of https://github.com/robonen/tools.git synced 2026-03-20 02:44:45 +00:00
Files
tools/packages/stdlib/src/bits/vector/index.ts

61 lines
1.2 KiB
TypeScript

export interface BitVector {
getBit(index: number): boolean;
setBit(index: number): void;
clearBit(index: number): void;
previousBit(index: number): number;
}
/**
* @name BitVector
* @category Bits
* @description A bit vector is a vector of bits that can be used to store a collection of bits
*
* @since 0.0.3
*/
export class BitVector extends Uint8Array implements BitVector {
constructor(size: number) {
super(Math.ceil(size / 8));
}
getBit(index: number) {
const value = this[index >> 3]! & (1 << (index & 7));
return value !== 0;
}
setBit(index: number) {
this[index >> 3]! |= 1 << (index & 7);
}
clearBit(index: number): void {
this[index >> 3]! &= ~(1 << (index & 7));
}
previousBit(index: number): number {
while (index !== ((index >> 3) << 3)) {
--index;
if (this.getBit(index)) {
return index;
}
}
let byteIndex = (index >> 3) - 1;
while (byteIndex >= 0 && this[byteIndex] === 0)
--byteIndex;
if (byteIndex < 0)
return -1;
index = (byteIndex << 3) + 7;
while (index >= (byteIndex << 3)) {
if (this.getBit(index))
return index;
--index;
}
throw new RangeError('Unreachable value');
}
}