реклама на сайте
подробности

 
 
> Битовый массив, как объявить
Muadib
сообщение Apr 7 2012, 12:57
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 10-12-07
Пользователь №: 33 170



как объявить битовый массив к примеру а[i][j] of byte и как с ним работать, помогите.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Muadib
сообщение Apr 7 2012, 14:55
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 10-12-07
Пользователь №: 33 170



для ясности вот к примеру этот код, а как он будет выглядеть на си.

A:array[0..N,0..M]of byte; // и в места byte чтоб бит был, так как это в 8 раз меньше места занимает

for i := 1 to N do begin
for j := 1 to M do begin
T[i,j]=1;
end;
end;

Сообщение отредактировал Muadib - Apr 7 2012, 15:01
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Apr 7 2012, 15:04
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Muadib @ Apr 7 2012, 17:55) *
для ясности вот к примеру этот код, а как он будет выглядеть на си.

A:array[0..N,0..M]of byte; // и в места byte чтоб бит был, так как это в 8 раз меньше места занимает

for i := 1 to N do begin
for j := 1 to M do begin
T[i,j]=1;
end;
end;


На Си никак - типа bit не существует.
Можно пробовать на С++ что-нибудь: создать свой класс, перегрузить операторы и тд.
Go to the top of the page
 
+Quote Post
demitar
сообщение Apr 7 2012, 18:12
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 3-09-09
Пользователь №: 52 170



в с++ для этих целей есть 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
Причина редактирования: длинные строки вызывают горизонтальный скроллинг
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th August 2025 - 07:39
Рейтинг@Mail.ru


Страница сгенерированна за 0.01493 секунд с 7
ELECTRONIX ©2004-2016