Модераторы: 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   Вверх
MAKCim
Дата 19.1.2007, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Цитата

Т.е. получается, что конкретно для класса bool меняется реализация? Ведь нет типа данных Бит?

ключевые слова: специализация шаблона


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

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


Эксперт
****


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

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



Цитата(MAKCim @  19.1.2007,  20:47 Найти цитируемый пост)
ключевые слова: специализация шаблона 

Это об чем?

Мне действительно непонятна реализация такого шаблона.
Если я хочу написать свой шаблонный класс, который по-разному бы реагировал на тип в аргументе?
Например пишу шаблон:
Код

template <class T>
class Mas10
{
   T Temp[10];
// Куча полезных методов
}


И если я хочу, чтобы мой класс по-разному отреагировал на конкретный тип данных, то каким путем это решено в vector<bool>?

Повторяю: мне просто занятно стало. Это действительно как-то решено или это пожелания Герба Саттера?
PM MAIL ICQ   Вверх
MAKCim
Дата 19.1.2007, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Anikmar
Код

template<> class Mas10<bool> {
    bool Temp[10];
...
};


Это сообщение отредактировал(а) MAKCim - 19.1.2007, 21:24


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

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



****


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

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



Цитата(Anikmar @  19.1.2007,  21:00 Найти цитируемый пост)
Это действительно как-то решено или это пожелания Герба Саттера? 

smile скорее пожелания стандарта.
Цитата(Anikmar @  19.1.2007,  21:00 Найти цитируемый пост)
Мне действительно непонятна реализация такого шаблона.

мне тоже, но я не расстраиваюсь smile (меня больше интересует практическая часть), но если бы мне вдруг захотелось разобраться, то я начал бы, пожалуй, с изучения файла vector
PM MAIL   Вверх
Anikmar
Дата 19.1.2007, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(zkv @  19.1.2007,  21:28 Найти цитируемый пост)
то я начал бы, пожалуй, с изучения файла vector 


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

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

Вариант определения шаблона, показанный в посте MAKCim меня просветил (я так ни разу не делал).
НО...
Тогда получается дублирование всех методов в двух разных шаблонах для обеспечения работы с конкретными типами данных...

На самом деле в векторе немного не так сделано - там маленький служебный класс, отвечающий за выделение памяти и обращение к конкретному элементу видимо отрабатывает что-то отдельное для bool. Но сходу не нашел где.

ИМХО Я и так не особый любитель STL. Но посмотрев конкретику реализации vector у меня появились сомнения, что использование STL приведет к ускорению работы программы и к экономии памяти... Вот к экономии времени на исходный код - возможно.
PM MAIL ICQ   Вверх
Rockie
Дата 19.1.2007, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Anikmar @  19.1.2007,  21:41 Найти цитируемый пост)
 у меня появились сомнения, что использование STL приведет к ускорению работы программы и к экономии памяти... Вот к экономии времени на исходный код - возможно.

все зависит от того кто и как пишет то или иное.

Цитата(Anikmar @  19.1.2007,  21:41 Найти цитируемый пост)
Если есть обсуждаемая тема, и есть люди, которые уже в этом разбирались

Вот и были люди(и щас есть) которые в свое время очень долго и нудно разбирались, создавая STL и добиваясь наилучшей реализации, причем по многим критериям. 




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



****


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

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



Цитата(Anikmar @  19.1.2007,  21:41 Найти цитируемый пост)
На самом деле в векторе немного не так сделано - там маленький служебный класс, отвечающий за выделение памяти и обращение к конкретному элементу 

smile, да, и совсем "небольшая" подборка базовых алгоритмов smile  
Цитата(Anikmar @  19.1.2007,  21:41 Найти цитируемый пост)
ИМХО Я и так не особый любитель STL. Но посмотрев конкретику реализации vector у меня появились сомнения, что использование STL приведет к ускорению работы программы и к экономии памяти...

к ускорению по сравнению с чем?
Цитата(Anikmar @  19.1.2007,  21:41 Найти цитируемый пост)
Вот к экономии времени на исходный код - возможно. 

экономия времени по сравнению с чем?

недостаток любой универсализации - дополнительные расходы ресурсов, плюсы известны.
невозможно определить эффективность универсального подхода (опять таки по сравнению с другим методом) не зная условия задачи
PM MAIL   Вверх
Anikmar
Дата 20.1.2007, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(zkv @  20.1.2007,  06:57 Найти цитируемый пост)
по сравнению с чем?


На круг - по сравнению с "ручным" написанием. В большинстве случаев ведь не надо самому реализовывать низкоуровненвые алгоритмы и т.п. - для этого, например, придумана IDE - которая служит для ускорения написания интерфейса и многих других вещей.

Я ни коим образом не хочу принизить достоинства STL - ее писало очень много народу и очень долго. Этот вопрос я поднял чисто из интереса самообразования - из цикла "Как оно сделано" - интересно все-таки.

Любой универсализм естественно тратит рессурсы. (Взять, например, технологию COM). Конкретно задачи, указанной в данном топике, vector<bool> подоходит как нельзя лучше, не знаю на счет критерий скорости (нужна ли там супер высокая скорость или нет).

А по поводу моего личного "прохладного" отношения к STL - это чисто ИМХО.
Видимо сказывается то, что начинал я на очень скромных рессурсах - приходилось, в основном, программировать контроллеры АСУ, а там рессурсов было ну очень мало.

Цитата(zkv @  20.1.2007,  06:57 Найти цитируемый пост)
да, и совсем "небольшая" подборка базовых алгоритмов

Я не говорю про простоту класса vector. Я говорю про подход, указанный MAKCimом, когда он мне объяснил как разделить шаблоны для разных типов. Если делать разные объявления vectora для разных типов - было бы совсем соложно. Разработчики несколько упростили и вынесли типозависимые участки в маленькие служебные классы с 2 методами (их так проще сопровождать). Резюме: век живи - век учись.
Правда все равно дураком помрешь  smile 
PM MAIL ICQ   Вверх
zkv
Дата 20.1.2007, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Цитата(Anikmar @  20.1.2007,  11:49 Найти цитируемый пост)
Я не говорю про простоту класса vector. Я говорю про подход, указанный MAKCimом,

Anikmar, виноват, не внимательно прочитал ваш пост, теперь понял о чем речь. Мои извинения.
 
Цитата(Anikmar @  20.1.2007,  11:49 Найти цитируемый пост)
А по поводу моего личного "прохладного" отношения к STL - это чисто ИМХО.
Видимо сказывается то, что начинал я на очень скромных рессурсах - приходилось, в основном, программировать контроллеры АСУ, а там рессурсов было ну очень мало.

не в обиду, вспоминается герой рассказа Д. Лондона "Любовь к жизни", который довольно долгое время голодал, и потом когда его подобрали собирал сухари под матрацем smile Нет я не отрицаю, бывают "голодные" ситуации когда приходится учитывать каждый "сухарь" smile, но в большинстве задач такая экономия, пожалуй, будет смотреться как паранойя.
PM MAIL   Вверх
Anikmar
Дата 20.1.2007, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(zkv @  20.1.2007,  13:18 Найти цитируемый пост)
но в большинстве задач такая экономия, пожалуй, будет смотреться как паранойя. 


Полностью с этим согласен!
PM MAIL ICQ   Вверх
The Thing
Дата 20.1.2007, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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 
-------------------------------

Код


#include <math.h>
#include <iostream>
#include <conio.h>

using namespace std;

class CWorBit
{
    char m_str[100];
    size_t m_length;
public:
    CWorBit()
    {
        strcpy_s(m_str, "мама мыла раму"); //строка которая выводится
        m_length = strlen(m_str);
    }

    void Display()
    {
        size_t pos=0;
        for(;pos<m_length; pos++){
            unsigned char _posBit=128;
            for(;; _posBit/=2){
                cout << bool(m_str[pos]&_posBit) << flush;
                if(_posBit == 1)
                    break;
            }

            cout << " " << flush;
        }
    }

    void SetBit(size_t Idx, bool zn);
    bool GetBit(size_t Idx);
    void CutMusk(size_t m, size_t n);
};

//получить бит
bool CWorBit::GetBit(size_t Idx)
{
    unsigned char posBit_beg = 128;
    size_t pos=0;
    for(; pos<size_t(double(Idx%8)+0.0001); pos++)
        posBit_beg = posBit_beg/2;

    return (bool)(m_str[Idx/8]&posBit_beg);
}

//поставить бит
void CWorBit::SetBit(size_t Idx, bool zn)
{
    unsigned char posBit_beg = 128;

    size_t pos=0;
    for(; pos<size_t(double(Idx%8)+0.0001); pos++)
        posBit_beg = posBit_beg/2;

    if(zn)
        m_str[Idx/8] = m_str[Idx/8]|posBit_beg;
    else{
        if(m_str[Idx/8]&posBit_beg)
            m_str[Idx/8] = m_str[Idx/8]^posBit_beg;
    }
}

//Вырезать кусок
void CWorBit::CutMusk(size_t m, size_t n)
{
    if(m >=n || n > m_length*8){
        cerr << "CutMusk error m=" << m << " n=" << n << flush;
        return;
    }
    
    bool bit=0;
    size_t pos=n, erase_beg = m; //нужный нам бит
    for(;pos<m_length*8; pos++){
        bit = GetBit(pos); SetBit(erase_beg++, bit);
    }

    pos = erase_beg; //обрезаем массив
    for(;pos<m_length*8; pos++){
        SetBit(pos, 0);
    }

    m_length = strlen(m_str); //изменяем длину

}

void main(void)
{
    CWorBit wbit;
    wbit.Display();

    cout << endl;

    wbit.CutMusk(12, 48);
    wbit.Display();

    getch();
}


А всем вышекомментирующим:
не надо лениться написать три строчки кода. Вся программа заключается в функциях Get и SetBit. smile

Добавлено @ 16:49 
счет битов с нуля


--------------------
Правильность работы программы зависит от двух велечин.
В нужном месте должны стоять нолик и еденичка.
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.1452 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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