00001
00002
00003 #ifndef BITVECTOR_H
00004 #define BITVECTOR_H
00005
00006 #include <stdio.h>
00007
00008 class bitvector
00009 {
00010 unsigned *bits;
00011 int size, num;
00012
00013 bitvector (void) { bits = NULL; size = num = 0; }
00014 public:
00015 bitvector (int s)
00016 {
00017 size = s;
00018 num = s / (sizeof (unsigned) * 8) + 1;
00019 bits = new unsigned [num];
00020 Clear();
00021 }
00022 bitvector (const bitvector &orig)
00023 {
00024 size = orig.size;
00025 num = orig.num;
00026 bits = new unsigned [orig.num];
00027 Clear();
00028 for (int i = 0; i < num; i++) bits[i] = orig.bits[i];
00029 }
00030 bitvector & operator = (const bitvector &orig)
00031 {
00032 if (this != &orig)
00033 {
00034 delete[] bits;
00035 size = orig.size;
00036 num = orig.num;
00037 bits = new unsigned [orig.num];
00038 Clear();
00039 for (int i = 0; i < num; i++) bits[i] = orig.bits[i];
00040 }
00041 return *this;
00042 }
00043 ~bitvector() { delete[] bits; }
00044
00045 int GetSize (void) { return size; }
00046
00047 void Clear (void)
00048 {
00049 for (int i = 0; i < num; i++) bits[i] = 0;
00050 }
00051 void Unclear (void)
00052 {
00053 for (int i = 0; i < num; i++) bits[i] = ~0;
00054 }
00055 void Set (int b)
00056 {
00057 int n = b / (sizeof (unsigned) * 8);
00058 if (n >= num || b < 0)
00059 {
00060 fprintf (stderr, "bitvector error: bit %d out of range.\n", b);
00061 return;
00062 }
00063
00064 int bit = b % (sizeof (unsigned) * 8);
00065 bits[n] |= (1 << bit);
00066 return;
00067 }
00068 void Reset (int b)
00069 {
00070 int n = b / (sizeof (unsigned) * 8);
00071 if (n >= num || b < 0)
00072 {
00073 fprintf (stderr, "bitvector error: bit %d out of range.\n", b);
00074 return;
00075 }
00076
00077 int bit = b % (sizeof (unsigned) * 8);
00078 bits[n] &= ~(1 << bit);
00079 return;
00080 }
00081 int Read (int b)
00082 {
00083 int n = b / (sizeof (unsigned) * 8);
00084 if (n >= num || b < 0)
00085 {
00086 fprintf (stderr, "bitvector error: bit %d out of range.\n", b);
00087 return 2;
00088 }
00089
00090 int bit = b % (sizeof (unsigned) * 8);
00091
00092 int value = ((bits[n] & (1 << bit)) != 0);
00093 return value;
00094 }
00095
00096 bitvector operator ~ (void)
00097 {
00098 bitvector temp (size);
00099 for (int i = 0; i < num; i++) temp.bits[i] = ~(bits[i]);
00100 return temp;
00101 }
00102 bitvector operator | (bitvector mask)
00103 {
00104 bitvector temp (size);
00105 if (size != mask.size)
00106 {
00107 fprintf (stderr, "bitvector error: mask size mismatch.\n");
00108 return temp;
00109 }
00110
00111 for (int i = 0; i < num; i++) temp.bits[i] = bits[i] | mask.bits[i];
00112 return temp;
00113 }
00114 bitvector operator & (bitvector mask)
00115 {
00116 bitvector temp (size);
00117 if (size != mask.size)
00118 {
00119 fprintf (stderr, "bitvector error: mask size mismatch.\n");
00120 return temp;
00121 }
00122
00123 for (int i = 0; i < num; i++) temp.bits[i] = bits[i] & mask.bits[i];
00124 return temp;
00125 }
00126 int operator == (bitvector other)
00127 {
00128 if (size != other.size)
00129 return 0;
00130
00131 for (int i = 0; i < num; i++)
00132 if (bits[i] != other.bits[i]) return 0;
00133
00134 return 1;
00135 }
00136 int operator != (bitvector other)
00137 {
00138 return (!(*this == other));
00139 }
00140 void Show (void)
00141 {
00142 cerr << "\n";
00143 for (int i = (size - 1); i >= 0; i--) {
00144 if (Read(i))
00145 cerr << "1";
00146 else
00147 cerr << "0";
00148 }
00149 cerr << "\n";
00150 }
00151 };
00152
00153
00154
00155
00156
00157
00158 #endif