00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef __BITVEC_H__
00018 #define __BITVEC_H__
00019
00020 #include <assert.h>
00021 #include <math.h>
00022 #include <vector>
00023 #include <string>
00024 #include <iostream>
00025
00026 #include <mathGutz.h>
00027 #include <arrayGutz.h>
00028
00029 namespace gutz {
00030
00031 #ifdef WIN32
00032 #ifdef _DEBUG
00033
00034
00035 #pragma warning(disable : 4786)
00036 #endif
00037 #endif
00038
00039
00040 class BitVector;
00041 typedef std::vector<BitVector> VecBitVec;
00042 typedef std::vector<BitVector*> VecBitVecP;
00043 typedef std::vector<VecBitVec> VecVecBitVec;
00044
00045 extern const uint g_BITS_PER_WORD;
00046 extern const uint g_POW_OF_2_BITS_PER_WORD;
00047
00048 inline uint bitNum2wordNum(const uint bitNum);
00049 inline uint bitMask(const uint bitNum);
00050 inline uint bits2Words(const uint numBits);
00051 inline uint fillWord(const bool initVal);
00052 inline uint getBinary(const uint word, const uint bitNum);
00053
00054 class BitRef;
00055
00056 class BitVector
00057 {
00058 public:
00059
00060 BitVector(const int numBits=0);
00061 BitVector(const int numBits, const bool initVal);
00062 BitVector(const std::string& bitstring);
00063 BitVector( uint word );
00064 BitVector(const arrayw1ui& data );
00065 BitVector(const arrayw1ub& data );
00066 BitVector(const BitVector& rhs);
00067 ~BitVector();
00068
00069
00070
00071
00072
00073 ubyte* dataub() const {return (ubyte*)(m_vec.data());}
00074 uint* dataui() const {return (uint*)(m_vec.data());}
00075
00076 const uint size() const {return m_numBits;}
00077 const uint numWords() const {return m_vec.size();}
00078 inline BitRef operator[] (const int i);
00079 inline const bool operator[] (const int i) const;
00080 BitVector& operator= (const BitVector& value);
00081 BitVector& operator= (const uint valWord);
00082 BitVector& operator= (const bool value);
00083
00084 std::vector<uint> trueBits() const;
00085 void trueBits( arrayw1ui& trueIndices ) const;
00086 uint numTrueBits() const;
00087
00088
00089 friend BitVector operator~ (const BitVector&);
00090 friend BitVector operator& (const BitVector&, const BitVector&);
00091 friend BitVector operator| (const BitVector&, const BitVector&);
00092 friend BitVector operator^ (const BitVector&, const BitVector&);
00093 friend BitVector operator- (const BitVector&, const BitVector&);
00094
00095 BitVector& not ();
00096 BitVector& operator&= (const BitVector&);
00097 BitVector& operator|= (const BitVector&);
00098 BitVector& operator^= (const BitVector&);
00099 BitVector& operator-= (const BitVector&);
00100
00101 bool operator== (const bool u);
00102 bool operator!= (const bool u);
00103 bool operator== (const BitVector& bv);
00104 bool operator!= (const BitVector& bv);
00105
00106 friend std::ostream &operator<<(std::ostream &, const BitVector& bv);
00107
00108
00109
00110
00111
00112
00113
00114 private:
00115 arrayo1ui m_vec;
00116 uint m_numBits;
00117
00118 const bool getBoolVal(const uint bitNum) const;
00119 };
00120
00121
00122
00123
00124 class BitRef
00125 {
00126 public:
00127 BitRef( uint* data, uint bit);
00128 BitRef( const BitRef& rhs);
00129
00130 BitRef& operator=(const BitRef& rhs);
00131 bool operator=(const bool u);
00132 bool operator() () const;
00133
00134 friend std::ostream &operator<<(std::ostream &, const BitRef& bv);
00135
00136
00137
00138
00139 private:
00140 uint* m_wordPtr;
00141 uint m_mask;
00142 };
00143
00144
00145
00146 inline BitRef BitVector::operator[] (const int bitNum) {
00147 assert( (uint)bitNum < m_numBits );
00148 return BitRef( &m_vec[bitNum2wordNum(bitNum)], bitNum );
00149 }
00150
00151
00152 inline const bool BitVector::operator[] (const int bitNum) const {
00153 assert( (uint)bitNum < m_numBits );
00154 return getBoolVal(bitNum);
00155 }
00156
00157
00158
00159 inline const bool BitVector::getBoolVal(const uint bitNum) const {
00160 uint wordNum = bitNum2wordNum(bitNum);
00161 uint mask = bitMask(bitNum);
00162 uint result = m_vec[wordNum] & mask;
00163 return (result > 0);
00164 }
00165
00166
00167 inline uint bitNum2wordNum(const uint bitNum) {
00168 return (bitNum >> g_POW_OF_2_BITS_PER_WORD);
00169 }
00170
00171
00172 inline uint bitMask(const uint bitNum) {
00173 uint bit = modPowOf2( bitNum, g_POW_OF_2_BITS_PER_WORD );
00174 return 1 << (g_BITS_PER_WORD - bit - 1);
00175 }
00176
00177
00178 inline uint bits2Words(const uint numBits) {
00179 return uint( ceil(numBits/(float)g_BITS_PER_WORD) );
00180 }
00181
00182
00183 inline uint fillWord(const bool initVal) {
00184 return initVal ? UINT_MAX : 0;
00185 }
00186
00187
00188 inline uint getBinary(const uint word, const uint bitNum) {
00189 return (uint)((word & (1<<bitNum)) >> bitNum);
00190 }
00191
00192 }
00193
00194 #endif
00195
00196
00197