added some convenience functions for bitvector
This commit is contained in:
parent
2621f444e1
commit
631ec298f5
23
bitvector.h
23
bitvector.h
@ -51,6 +51,9 @@ public:
|
|||||||
unsigned int size() const {return (nn*blockbits)-blockbits+(modulo?modulo:blockbits);};
|
unsigned int size() const {return (nn*blockbits)-blockbits+(modulo?modulo:blockbits);};
|
||||||
//arguments must be unsigned to keep the resulting assembly code simple and efficient
|
//arguments must be unsigned to keep the resulting assembly code simple and efficient
|
||||||
const bool operator[](const unsigned int i) const {return (v[i/blockbits] >>(i%blockbits))&1UL;};
|
const bool operator[](const unsigned int i) const {return (v[i/blockbits] >>(i%blockbits))&1UL;};
|
||||||
|
bitvector_block getblock(const unsigned int i) const {return v[i];}; //integer interpretation
|
||||||
|
void setblock(const unsigned int i, const bitvector_block b) {v[i]=b;};
|
||||||
|
int getblocksize() const {return 8*sizeof(bitvector_block);};
|
||||||
void set(const unsigned int i) {v[i/blockbits] |= (1UL<<(i%blockbits));};
|
void set(const unsigned int i) {v[i/blockbits] |= (1UL<<(i%blockbits));};
|
||||||
void reset(const unsigned int i) {v[i/blockbits] &= ~(1UL<<(i%blockbits));};
|
void reset(const unsigned int i) {v[i/blockbits] &= ~(1UL<<(i%blockbits));};
|
||||||
const bool get(const unsigned int i) {return (v[i/blockbits] >>(i%blockbits))&1UL;};
|
const bool get(const unsigned int i) {return (v[i/blockbits] >>(i%blockbits))&1UL;};
|
||||||
@ -80,6 +83,26 @@ public:
|
|||||||
void write(int fd, bool dimensions=1, bool transp=0);
|
void write(int fd, bool dimensions=1, bool transp=0);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//expand to separate bytes or ints
|
||||||
|
template <typename T>
|
||||||
|
void bitvector_expand(const bitvector &v, NRVec<T> &r)
|
||||||
|
{
|
||||||
|
int n=v.size();
|
||||||
|
r.resize(n);
|
||||||
|
r.clear();
|
||||||
|
for(int i=0; i<n; ++i) if(v[i]) r[i]=1;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
void bitvector_compress(bitvector &r, const NRVec<T> &v)
|
||||||
|
{
|
||||||
|
int n=v.size();
|
||||||
|
r.resize(n);
|
||||||
|
r.clear();
|
||||||
|
for(int i=0; i<n; ++i) if(v[i]) r.set(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
extern std::ostream & operator<<(std::ostream &s, const bitvector &x);
|
extern std::ostream & operator<<(std::ostream &s, const bitvector &x);
|
||||||
extern std::istream & operator>>(std::istream &s, bitvector &x);
|
extern std::istream & operator>>(std::istream &s, bitvector &x);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user