![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
kutuzov |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 19.1.2007 Репутация: нет Всего: нет |
Добрый день
У меня есть массив битов. char * mask; mask = new char[MaskSize]; Надо написать функцию, вырезаюшую из массива биты от m до n (размер массива естественно уменьшается) т.е. Пишу функцию CutMask(m,n) Не очень у меня получается что-то ... может кто подскажет как ?? Неплохо бы на примере... ![]() ![]() |
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Т.е. если я правильно понял - этот массив рассматривается как длиннющая последовательность битов?
Или каждый символ представляет собой представления битов? |
|||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Anikmar, я так понял - все таки второе..
Вопрос на засыпку - MaskSize > 4 или нет? От этого, как мне кажется - много чего зависит... |
|||
|
||||
Frage |
|
|||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 17.8.2006 Репутация: нет Всего: нет |
Без пояснения решения не найти - если MaskSize==3, то мask массив из 3-х бит или 24? А удалять что-либо можно только перекопировав содержимое в новую строку, убив старую
|
|||
|
||||
kutuzov |
|
||||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 19.1.2007 Репутация: нет Всего: нет |
Рассматривается как последовательность битов. т.е. есть некий список элементов. Информация о том использовать их или нет сохраняется в массив. таким образом, например: есть 12 элементов. из них установлены только первый и 3й. Битовый массив из 2х байтов. массив будет выгладить так: 10100000 00000000 (т.к. установлены только 1й и 2й элемент) Добавлено @ 17:00
MaskSize==3 то массив из 8 бит(1 байт). как создать массив из 3х бит, а уж тем более записать можно я не знаю... |
||||
|
|||||
GIK |
|
|||
![]() Добрый человек ![]() ![]() Профиль Группа: Участник Сообщений: 985 Регистрация: 3.6.2005 Где: я только не небыв ал Репутация: 1 Всего: 14 |
А не легче тогда создать структуру?
Если нужно использовать массив, и при этом динамически удалять эллементы, то можно использовать вектор. -------------------- Математика=>пиво=> програмирование, три вещи последовательны и совместимы !!! Программирование - это не деятельнось! Программирование - это состояние души! Бог - самый крутой программист. |
|||
|
||||
zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
задача учебная? Если нет то, думаю, std::vector<bool> тебе поможет
Это сообщение отредактировал(а) zkv - 19.1.2007, 17:32 |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Лучше std::bitset
-------------------- ... |
|||
|
||||
zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
||||
|
||||
cia |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 207 Регистрация: 15.1.2007 Репутация: нет Всего: 4 |
А много ли элементов в массиве?
Если не очень много, то может проще было бы использовать все-таки 1 байт = 1 биту (флагу) ? Тогда функция будет заключаться в копировании части строки "из середины в начало" и уменьшении ее длины. zkv, поочередно удалить каждый элемент? |
|||
|
||||
Rockie |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 8 Всего: 31 |
хмм, всмысле нулевой и второй? или первый и третий.. а биты ты считаешь слева направо?
можешь привести пример исходных данных и результата работы функции? -------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
|||
|
||||
kutuzov |
|
||||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 19.1.2007 Репутация: нет Всего: нет |
элементов много. Если битовый массив, то примерно 1Мб выходит. Если для каждого флажка использовать не бит а байт уже не метр получается ![]() - потери памяти - скорости - и плюс ко всему конфиг 1 Мб или 8 мб читать/писать 2 больше разницы... Добавлено @ 19:12
Пробовал через bitset перегонять... const int Mask1Size=OldSize; bitset<Mask1Size> bOld; получаю Template argument must be a constant expression т.е. на сколько понял размер надо задавать при компиляции... |
||||
|
|||||
zkv |
|
||||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
std::vector<bool> - массив битов, а не байтов
|
||||
|
|||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Интересно, если STL - шаблонные классы, то как они реализовали в одном шаблоне и биты и другие типы? т.е. vector<int> и vector<bool> получается разные шаблоны? Я думал, что шаблонный класс реализован одинаково с точки зрения внутренних конструкций... template class<T> Т.е. получается, что конкретно для класса bool меняется реализация? Ведь нет типа данных Бит? |
|||
|
||||
zkv |
|
||||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
я о нем, во всяком случае, ничего не знаю ![]()
примечание к предыдущей цитате ![]()
Ссылка на эту главу есть в закрепленной теме форума |
||||
|
|||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
ключевые слова: специализация шаблона -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Это об чем? Мне действительно непонятна реализация такого шаблона. Если я хочу написать свой шаблонный класс, который по-разному бы реагировал на тип в аргументе? Например пишу шаблон:
И если я хочу, чтобы мой класс по-разному отреагировал на конкретный тип данных, то каким путем это решено в vector<bool>? Повторяю: мне просто занятно стало. Это действительно как-то решено или это пожелания Герба Саттера? |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
Anikmar,
Это сообщение отредактировал(а) MAKCim - 19.1.2007, 21:24 -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
![]() мне тоже, но я не расстраиваюсь ![]() |
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
А вы туда заглядывали? Там достаточно много всего наверчено, я туда естественно заглянул перед тем как отправить свой пост. Если есть обсуждаемая тема, и есть люди, которые уже в этом разбирались - какой смысл перелопачивать кучу хедеров? Это чисто познавательный интерес - я не доходил в реализации собственных шаблонных классов до "перегрузки" с точки зрения типов - форум для того и существует, чтобы делиться опытом. Вариант определения шаблона, показанный в посте MAKCim меня просветил (я так ни разу не делал). НО... Тогда получается дублирование всех методов в двух разных шаблонах для обеспечения работы с конкретными типами данных... На самом деле в векторе немного не так сделано - там маленький служебный класс, отвечающий за выделение памяти и обращение к конкретному элементу видимо отрабатывает что-то отдельное для bool. Но сходу не нашел где. ИМХО Я и так не особый любитель STL. Но посмотрев конкретику реализации vector у меня появились сомнения, что использование STL приведет к ускорению работы программы и к экономии памяти... Вот к экономии времени на исходный код - возможно. |
|||
|
||||
Rockie |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 8 Всего: 31 |
все зависит от того кто и как пишет то или иное.
Вот и были люди(и щас есть) которые в свое время очень долго и нудно разбирались, создавая STL и добиваясь наилучшей реализации, причем по многим критериям. -------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
||||
|
|||||
zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
![]() ![]() к ускорению по сравнению с чем? экономия времени по сравнению с чем? недостаток любой универсализации - дополнительные расходы ресурсов, плюсы известны. невозможно определить эффективность универсального подхода (опять таки по сравнению с другим методом) не зная условия задачи |
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
На круг - по сравнению с "ручным" написанием. В большинстве случаев ведь не надо самому реализовывать низкоуровненвые алгоритмы и т.п. - для этого, например, придумана IDE - которая служит для ускорения написания интерфейса и многих других вещей. Я ни коим образом не хочу принизить достоинства STL - ее писало очень много народу и очень долго. Этот вопрос я поднял чисто из интереса самообразования - из цикла "Как оно сделано" - интересно все-таки. Любой универсализм естественно тратит рессурсы. (Взять, например, технологию COM). Конкретно задачи, указанной в данном топике, vector<bool> подоходит как нельзя лучше, не знаю на счет критерий скорости (нужна ли там супер высокая скорость или нет). А по поводу моего личного "прохладного" отношения к STL - это чисто ИМХО. Видимо сказывается то, что начинал я на очень скромных рессурсах - приходилось, в основном, программировать контроллеры АСУ, а там рессурсов было ну очень мало. Я не говорю про простоту класса vector. Я говорю про подход, указанный MAKCimом, когда он мне объяснил как разделить шаблоны для разных типов. Если делать разные объявления vectora для разных типов - было бы совсем соложно. Разработчики несколько упростили и вынесли типозависимые участки в маленькие служебные классы с 2 методами (их так проще сопровождать). Резюме: век живи - век учись. Правда все равно дураком помрешь ![]() |
|||
|
||||
zkv |
|
|||
![]() ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2133 Регистрация: 23.7.2006 Где: Санкт-Петербург Репутация: 26 Всего: 92 |
Anikmar, виноват, не внимательно прочитал ваш пост, теперь понял о чем речь. Мои извинения. не в обиду, вспоминается герой рассказа Д. Лондона "Любовь к жизни", который довольно долгое время голодал, и потом когда его подобрали собирал сухари под матрацем ![]() ![]() |
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
||||
|
||||
The Thing |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 286 Регистрация: 6.9.2004 Репутация: нет Всего: 3 |
Специально для автора темы потратил 15 минут.
Массив рассматривается как непрерывный поток данных с лево направо. Вывод на экран до и после вырезания битов: ------------------------------- 11101100 11100000 11101100 11100000 00100000 11101100 11111011 11101011 11100000 00100000 11110000 11100000 11101100 11110011 11101100 11101111 10111110 10111110 00000010 00001111 00001110 00001110 11001111 00110000 -------------------------------
А всем вышекомментирующим: не надо лениться написать три строчки кода. Вся программа заключается в функциях Get и SetBit. ![]() Добавлено @ 16:49 счет битов с нуля -------------------- Правильность работы программы зависит от двух велечин. В нужном месте должны стоять нолик и еденичка. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |