stickyants-bitset-js
Version:
A Bit vector library that mirrors Java's BitSet class
72 lines (62 loc) • 1.47 kB
text/typescript
const numberLength = 31;
export class BitSet {
vector: number[] = [];
update(idx: number, val: boolean) {
var vectorIndex = Math.floor(idx / numberLength);
this.expand(idx);
if (val) {
this.vector[vectorIndex] |= 1 << (idx % numberLength);
} else {
this.vector[vectorIndex] &= ~(1 << (idx % numberLength));
}
}
expand(idx: number) {
var updated = false;
var vectorIndex = Math.floor(idx / numberLength);
if (vectorIndex >= this.vector.length) {
var len = this.vector.length - vectorIndex;
if (len > 0) {
updated = true;
}
for (var i = 0; i < len; i++) {
this.vector.push(0);
}
}
if (updated) {
this.vector = this.vector.slice(0);
}
}
getBit(idx: number) {
var vectorIndex = Math.floor(idx / numberLength);
if (vectorIndex >= this.vector.length){
return 0;
}
var val = this.vector[vectorIndex];
return (val >> (idx % numberLength)) & 0x1;
}
toggle(idx: number) {
if (this.isClear(idx)) {
this.set(idx);
} else {
this.clear(idx);
}
}
set(idx: number) {
this.update(idx, true);
}
clear(idx: number) {
this.update(idx, false);
}
isSet(idx: number) {
return this.getBit(idx) === 1;
}
isClear(idx: number) {
return this.getBit(idx) === 0;
}
getValue() {
return this.vector;
}
toString() {
return this.vector.map(e => e.toString(2)).join('');
}
}