Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Битовый массив 
:(
    Опции темы
kutuzov
Дата 19.1.2007, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 19.1.2007

Репутация: нет
Всего: нет



Добрый день
У меня есть массив битов.
char * mask;
mask = new char[MaskSize];

Надо написать функцию, вырезаюшую из массива биты от m до n (размер массива естественно уменьшается)
т.е. Пишу функцию CutMask(m,n)

Не очень у меня получается что-то ... может кто подскажет как ?? Неплохо бы на примере... 

 smile  smile 
PM MAIL   Вверх
Anikmar
Дата 19.1.2007, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Т.е. если я правильно понял - этот массив рассматривается как длиннющая последовательность битов?
Или каждый символ представляет собой представления битов?
PM MAIL ICQ   Вверх
JackYF
Дата 19.1.2007, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Anikmar, я так понял - все таки второе..

Вопрос на засыпку - MaskSize > 4 или нет?
От этого, как мне кажется - много чего зависит...


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Frage
Дата 19.1.2007, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 17.8.2006

Репутация: нет
Всего: нет



Без пояснения решения не найти - если MaskSize==3, то мask массив из 3-х бит или 24? А удалять что-либо можно только перекопировав содержимое в новую строку, убив старую
PM MAIL   Вверх
kutuzov
Дата 19.1.2007, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 19.1.2007

Репутация: нет
Всего: нет



Цитата(Anikmar @ 19.1.2007,  15:53)
Т.е. если я правильно понял - этот массив рассматривается как длиннющая последовательность битов?
Или каждый символ представляет собой представления битов?

Рассматривается как последовательность битов. 
т.е. есть некий список элементов. Информация о том использовать их или нет сохраняется в массив. таким образом, например:
есть 12 элементов.
из них установлены только первый и 3й.

Битовый массив из 2х байтов.
массив будет выгладить так: 
10100000 00000000 (т.к. установлены только 1й и 2й элемент)

Добавлено @ 17:00 
Цитата(Frage @ 19.1.2007,  16:28)
Без пояснения решения не найти - если MaskSize==3, то мask массив из 3-х бит или 24? А удалять что-либо можно только перекопировав содержимое в новую строку, убив старую

MaskSize==3

то массив из 8 бит(1 байт).
как создать массив из 3х бит, а уж тем более записать можно я не знаю...

PM MAIL   Вверх
GIK
Дата 19.1.2007, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый человек
**


Профиль
Группа: Участник
Сообщений: 985
Регистрация: 3.6.2005
Где: я только не небыв ал

Репутация: 1
Всего: 14



А не легче тогда создать структуру? 
Если нужно использовать массив, и при этом динамически удалять эллементы, то можно использовать вектор.



--------------------
Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!!
Программирование - это не деятельнось! Программирование - это состояние души!
Бог - самый крутой программист.
PM MAIL ICQ   Вверх
zkv
Дата 19.1.2007, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



задача учебная? Если нет то, думаю, std::vector<bool> тебе поможет

Это сообщение отредактировал(а) zkv - 19.1.2007, 17:32
PM MAIL   Вверх
Earnest
Дата 19.1.2007, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Лучше std::bitset


--------------------
...
PM   Вверх
zkv
Дата 19.1.2007, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(Earnest @  19.1.2007,  17:35 Найти цитируемый пост)
Лучше std::bitset

вроде не стыкуется с 

Цитата(kutuzov @  19.1.2007,  15:43 Найти цитируемый пост)
(размер массива естественно уменьшается)


Цитата(MSDN)

Describes a type of object that stores a sequence consisting of a fixed number of bits 

PM MAIL   Вверх
cia
Дата 19.1.2007, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 15.1.2007

Репутация: нет
Всего: 4



А много ли элементов в массиве?
Если не очень много, то может проще было бы использовать все-таки 1 байт = 1 биту (флагу) ?
Тогда функция будет заключаться в копировании части строки "из середины в начало" и уменьшении ее длины.


zkv, поочередно удалить каждый элемент?
PM WWW ICQ   Вверх
Rockie
Дата 19.1.2007, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



Цитата(kutuzov @  19.1.2007,  16:56 Найти цитируемый пост)
10100000 00000000 (т.к. установлены только 1й и 2й элемент)

хмм, всмысле нулевой и второй? или первый и третий.. а биты ты считаешь слева направо?

Цитата(kutuzov @  19.1.2007,  15:43 Найти цитируемый пост)
Надо написать функцию, вырезаюшую из массива биты от m до n (размер массива естественно уменьшается)т.е. Пишу функцию CutMask(m,n)

можешь привести пример исходных данных и результата работы функции?




--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
kutuzov
Дата 19.1.2007, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 19.1.2007

Репутация: нет
Всего: нет



Цитата(cia @ 19.1.2007,  18:33)
А много ли элементов в массиве?
Если не очень много, то может проще было бы использовать все-таки 1 байт = 1 биту (флагу) ?
Тогда функция будет заключаться в копировании части строки "из середины в начало" и уменьшении ее длины.


zkv, поочередно удалить каждый элемент?

элементов много.
Если битовый массив, то примерно 1Мб выходит.
Если для каждого флажка использовать не бит а байт уже не метр получается smile
- потери памяти
- скорости
- и плюс ко всему конфиг 1 Мб или 8 мб читать/писать 2 больше разницы...

Добавлено @ 19:12 
Цитата(Earnest @ 19.1.2007,  17:35)
Лучше std::bitset

Пробовал через bitset перегонять...

const int Mask1Size=OldSize;
bitset<Mask1Size> bOld;
получаю
Template argument must be a constant expression

т.е. на сколько понял размер надо задавать при компиляции... 

PM MAIL   Вверх
zkv
Дата 19.1.2007, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(kutuzov @  19.1.2007,  19:08 Найти цитируемый пост)
Если битовый массив, то примерно 1Мб выходит.
Если для каждого флажка использовать не бит а байт уже не метр получается smile

std::vector<bool> - массив битов, а не байтов
Цитата(„Новые сложные задачи на C++ Автор: Герб Саттер.")

Попытка №2: использование стандартного контейнера упакованных битов
Вторая идея заключается в том, чтобы обратить внимание на то, что стандартная библиотека уже содержит два контейнера для хранения битов: bitset и vector<bool>. Для наших целей bitset — плохой вариант, поскольку bitset<N> имеет фиксированную длину N, а мы должны работать с потоками битов переменной длины. Не получается… Зато vector<bool>, несмотря на все его недостатки в данном случае оказывается тем, что доктор прописал


PM MAIL   Вверх
Anikmar
Дата 19.1.2007, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(zkv @  19.1.2007,  19:31 Найти цитируемый пост)
std::vector<bool> - массив битов, а не байтов

Цитата(„Новые сложные задачи на C++ Автор: Герб Саттер.")

Попытка №2: использование стандартного контейнера упакованных битов
Вторая идея заключается в том, чтобы обратить внимание на то, что стандартная библиотека уже содержит два контейнера для хранения битов: bitset и vector<bool>. Для наших целей bitset — плохой вариант, поскольку bitset<N> имеет фиксированную длину N, а мы должны работать с потоками битов переменной длины. Не получается… Зато vector<bool>, несмотря на все его недостатки в данном случае оказывается тем, что доктор прописал

Интересно, если STL - шаблонные классы, то как они реализовали в одном шаблоне и биты и другие типы?
т.е.
vector<int>
и 
vector<bool>
получается разные шаблоны?
Я думал, что шаблонный класс реализован одинаково с точки зрения внутренних конструкций...
template class<T>
Т.е. получается, что конкретно для класса bool меняется реализация? Ведь нет типа данных Бит?

PM MAIL ICQ   Вверх
zkv
Дата 19.1.2007, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(Anikmar @  19.1.2007,  20:33 Найти цитируемый пост)
Ведь нет типа данных Бит?
 
я о нем, во всяком случае,  ничего не знаю smile
Цитата(Anikmar @  19.1.2007,  20:33 Найти цитируемый пост)
Я думал, что шаблонный класс реализован одинаково с точки зрения внутренних конструкций...
template class<T>

примечание к предыдущей цитате smile
Цитата(„Новые сложные задачи на C++ Автор: Герб Саттер.")

(Конечно, стандарт не требует, чтобы реализация vector<bool> использовала упакованные биты, а только поощряет это. Тем не менее большинство реализаций именно так и поступают.)

Ссылка на эту главу есть в закрепленной теме форума

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0839 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.