mirror of
https://github.com/robonen/tools.git
synced 2026-03-20 10:54:44 +00:00
feat(packages/stdlib): add bit vector tool
This commit is contained in:
61
packages/stdlib/src/bits/vector/index.ts
Normal file
61
packages/stdlib/src/bits/vector/index.ts
Normal file
@@ -0,0 +1,61 @@
|
||||
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');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user