в с++ для этих целей есть std::vector<bool>, но, поскольку, он тяжелый, можно как-то так извратиться:
CODE
#include <iostream>
#include <cassert>
template <int SZ, typename BASE_T = unsigned int> // SZ - размер битового вектора,
class bitvec { // BASE_Т - базовый тип, в зависимости от архитектуры МК
BASE_T data[SZ / sizeof(BASE_T) + 1];
int shift;
int idx;
public:
bitvec<SZ>& operator[](int i) {
// при вызове оператора [] просто считаем индекс элемента в массиве и сдвиг
assert(i >= 0);
assert(i < SZ);
idx = i / sizeof(BASE_T);
shift = i & (sizeof(BASE_T) - 1);
return *this;
// возвращаем ссылку на себя, чтобы работало присваивание и преобразование типов
}
int operator=(int val) {
// записываем значение бита, индекс и сдвиг расчитали раньше с помощью []
val = val != 0;
data[idx] &= ~(1 << shift);
data[idx] |= (val << shift);
return val;
}
operator int() {
// приведение типа bitvec<> к int, чтобы работало присваивание a[i] = x, можно приводить к bool
return (data[idx] & (1 << shift)) >> shift;
}
};
// bitvec<15> test; // объявляем вектор из 15 бит
int main()
{
bitvec<10> bits[20]; // объявляем массив 20x10
for(int i = 0; i < 20; ++i) {
for(int j = 0; j < 10; ++j) {
bits[i][j] = (i * j) & 1; // пишем
std::cout << "bits[" << i << ", " << j << "] = ";
std::cout << bits[i][j] << " (" << ((i * j) & 1) << ") "; // читаем, что записали
std::cout << std::endl;
}
}
return 0;
}
Сообщение отредактировал IgorKossak - May 6 2012, 19:00
Причина редактирования: длинные строки вызывают горизонтальный скроллинг