00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #ifndef CBZ_BITS_H
00038 #define CBZ_BITS_H
00039
00040 #define BITS_PER_INT (8*sizeof(int))
00041
00042 class Bits {
00043 private:
00044 unsigned int *ints;
00045 int n, nints;
00046
00047 public:
00048 void reset_all (void) {
00049 for (int i=0; i<nints; i++) ints[i] = 0;
00050 }
00051
00052 Bits (int nn) {
00053 n = nn;
00054 nints = nn / BITS_PER_INT;
00055 if (nn % BITS_PER_INT) nints++;
00056 ints = new unsigned int[nints];
00057 reset_all ();
00058 }
00059
00060 ~Bits (void) {
00061 delete [] ints;
00062 }
00063
00064 void set (int pos, bool val) {
00065 int i = pos / BITS_PER_INT;
00066 int j = pos % BITS_PER_INT;
00067 if (val) {
00068 ints[i] |= (1<<j);
00069 } else {
00070 ints[i] &= ~(1<<j);
00071 }
00072 }
00073
00074 void set (int pos) {
00075 set (pos, true);
00076 }
00077
00078 void copy (Bits *b) {
00079 for (int i=0; i<nints; i++) ints[i] = b->ints[i];
00080 }
00081
00082 void reset (int pos) {
00083 set (pos, false);
00084 }
00085
00086 bool value (int pos) {
00087 int i = pos / BITS_PER_INT;
00088 int j = pos % BITS_PER_INT;
00089 if (ints[i] & (1<<j))
00090 return true;
00091 return false;
00092 }
00093
00094 void And (Bits *other) {
00095 for (int i=0; i<nints; i++)
00096 ints[i] &= other->ints[i];
00097 }
00098
00099 void Or (Bits *other) {
00100 for (int i=0; i<nints; i++)
00101 ints[i] |= other->ints[i];
00102 }
00103
00104 void Not (void) {
00105 for (int i=0; i<nints; i++)
00106 ints[i] = ~ints[i];
00107 }
00108
00109 Bits *clone (void) {
00110 Bits *b = new Bits (n);
00111 for (int i=0; i<nints; i++) b->ints[i] = ints[i];
00112 return b;
00113 }
00114 };
00115
00116 #endif // CBZ_BITS_H