34 255, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
35 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
36 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
37 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
38 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
39 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
40 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
41 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
42 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
43 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
44 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
45 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
46 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
47 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
48 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
49 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0
55 0, 0, 0, 0x2, 0, 0x4, 0x4, 0x6,
56 0, 0x8, 0x8, 0x0a, 0x08, 0x0c, 0x0c, 0x0e,
57 0, 0x10, 0x10, 0x12, 0x10, 0x14, 0x14, 0x16,
58 0x10, 0x18, 0x18, 0x1a, 0x18, 0x1c, 0x1c, 0x1e,
59 0, 0x20, 0x20, 0x22, 0x20, 0x24, 0x24, 0x26,
60 0x20, 0x28, 0x28, 0x2a, 0x28, 0x2c, 0x2c, 0x2e,
61 0x20, 0x30, 0x30, 0x32, 0x30, 0x34, 0x34, 0x36,
62 0x30, 0x38, 0x38, 0x3a, 0x38, 0x3c, 0x3c, 0x3e,
63 0, 0x40, 0x40, 0x42, 0x40, 0x44, 0x44, 0x46,
64 0x40, 0x48, 0x48, 0x4a, 0x48, 0x4c, 0x4c, 0x4e,
65 0x40, 0x50, 0x50, 0x52, 0x50, 0x54, 0x54, 0x56,
66 0x50, 0x58, 0x58, 0x5a, 0x58, 0x5c, 0x5c, 0x5e,
67 0x40, 0x60, 0x60, 0x62, 0x60, 0x64, 0x64, 0x66,
68 0x60, 0x68, 0x68, 0x6a, 0x68, 0x6c, 0x6c, 0x6e,
69 0x60, 0x70, 0x70, 0x72, 0x70, 0x74, 0x74, 0x76,
70 0x70, 0x78, 0x78, 0x7a, 0x78, 0x7c, 0x7c, 0x7e,
71 0, 0x80, 0x80, 0x82, 0x80, 0x84, 0x84, 0x86,
72 0x80, 0x88, 0x88, 0x8a, 0x88, 0x8c, 0x8c, 0x8e,
73 0x80, 0x90, 0x90, 0x92, 0x90, 0x94, 0x94, 0x96,
74 0x90, 0x98, 0x98, 0x9a, 0x98, 0x9c, 0x9c, 0x9e,
75 0x80, 0xa0, 0xa0, 0xa2, 0xa0, 0xa4, 0xa4, 0xa6,
76 0xa0, 0xa8, 0xa8, 0xaa, 0xa8, 0xac, 0xac, 0xae,
77 0xa0, 0xb0, 0xb0, 0xb2, 0xb0, 0xb4, 0xb4, 0xb6,
78 0xb0, 0xb8, 0xb8, 0xba, 0xb8, 0xbc, 0xbc, 0xbe,
79 0x80, 0xc0, 0xc0, 0xc2, 0xc0, 0xc4, 0xc4, 0xc6,
80 0xc0, 0xc8, 0xc8, 0xca, 0xc8, 0xcc, 0xcc, 0xce,
81 0xc0, 0xd0, 0xd0, 0xd2, 0xd0, 0xd4, 0xd4, 0xd6,
82 0xd0, 0xd8, 0xd8, 0xda, 0xd8, 0xdc, 0xdc, 0xde,
83 0xc0, 0xe0, 0xe0, 0xe2, 0xe0, 0xe4, 0xe4, 0xe6,
84 0xe0, 0xe8, 0xe8, 0xea, 0xe8, 0xec, 0xec, 0xee,
85 0xe0, 0xf0, 0xf0, 0xf2, 0xf0, 0xf4, 0xf4, 0xf6,
86 0xf0, 0xf8, 0xf8, 0xfa, 0xf8, 0xfc, 0xfc, 0xfe
91 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,
92 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
93 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
94 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
95 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
96 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
97 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
98 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
99 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
100 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
101 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
102 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
103 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
104 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
105 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
106 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8
113 array_ =
new uint32_t[WordLength()];
118 array_ =
new uint32_t[WordLength()];
119 memcpy(array_, src.array_, ByteLength());
123 Alloc(src.bit_size_);
124 memcpy(array_, src.array_, ByteLength());
141 int wordlen = WordLength();
148 uint32_t new_bit_size;
151 ReverseN(&new_bit_size,
sizeof(new_bit_size));
154 int wordlen = WordLength();
157 for (
int i = 0; i < wordlen; ++i)
158 ReverseN(&array_[i],
sizeof(array_[i]));
164 memset(array_, 0, ByteLength());
167 memset(array_, ~0, ByteLength());
174 int next_bit = prev_bit + 1;
175 if (next_bit >= bit_size_)
return -1;
177 int next_word = WordIndex(next_bit);
178 int bit_index = next_word * kBitFactor;
179 int word_end = bit_index + kBitFactor;
180 uint32_t word = array_[next_word];
181 uint8_t byte = word & 0xff;
182 while (bit_index < word_end) {
183 if (bit_index + 8 > next_bit && byte != 0) {
184 while (bit_index +
lsb_index_[byte] < next_bit && byte != 0)
195 int wordlen = WordLength();
196 while (next_word < wordlen && (word = array_[next_word]) == 0) {
198 bit_index += kBitFactor;
200 if (bit_index >= bit_size_)
return -1;
202 while ((word & 0xff) == 0) {
211 int wordlen = WordLength();
213 for (
int w = 0; w < wordlen; ++w) {
214 uint32_t word = array_[w];
215 for (
int i = 0; i < 4; ++i) {
226 int length = std::min(WordLength(), other.WordLength());
227 for (
int w = 0; w < length; ++w)
228 array_[w] |= other.array_[w];
231 int length = std::min(WordLength(), other.WordLength());
232 for (
int w = 0; w < length; ++w)
233 array_[w] &= other.array_[w];
234 for (
int w = WordLength() - 1; w >= length; --w)
238 int length = std::min(WordLength(), other.WordLength());
239 for (
int w = 0; w < length; ++w)
240 array_[w] ^= other.array_[w];
245 int length = std::min(v1.WordLength(), v2.WordLength());
246 for (
int w = 0; w < length; ++w)
247 array_[w] = v1.array_[w] ^ (v1.array_[w] & v2.array_[w]);
248 for (
int w = WordLength() - 1; w >= length; --w)
249 array_[w] = v1.array_[w];
254 void BitVector::Alloc(
int length) {
255 int initial_wordlength = WordLength();
257 int new_wordlength = WordLength();
258 if (new_wordlength != initial_wordlength) {
260 array_ =
new uint32_t[new_wordlength];
BitVector & operator=(const BitVector &src)
void operator &=(const BitVector &other)
void operator^=(const BitVector &other)
static const uint8_t lsb_eroded_[256]
bool Serialize(FILE *fp) const
bool Serialize(FILE *fp, const char *data, size_t n)
static const int hamming_table_[256]
void ReverseN(void *ptr, int num_bytes)
int NextSetBit(int prev_bit) const
bool DeSerialize(bool swap, FILE *fp)
void SetSubtract(const BitVector &v1, const BitVector &v2)
bool DeSerialize(FILE *fp, char *data, size_t n)
static const uint8_t lsb_index_[256]
void operator|=(const BitVector &other)