Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > исключающие маски |
Автор: zss 30.4.2009, 22:36 | ||
есть маски
они приходят в любой комбинации. Но маска "а", должна исключать маски "b" и "с". То есть, если пришла "a", то "b" и "c" должны сброситься, или если пришла "b" или "c". то должна сброситься "a". Можно ли их как организовать, чтоб при побитовом сложении осуществлялось это исключение. Или только руками проверять ? |
Автор: zss 30.4.2009, 23:09 | ||
как это так ? |
Автор: mes 30.4.2009, 23:22 |
Как я понял у Вас есть переменная которая должна быть равна значению одной маски, а не их сочетанию. Ну так присваивайте нужное значение и все. Или вопрос в чем то другом ? тогда перефразируйте плиз, чтоб можно было понять, чтоб Вам требуется. Можно попробовать подкрепить вопрос примером. ![]() |
Автор: zss 1.5.2009, 00:33 | ||
нет - "b" и "с" сочетаться могут |
Автор: MAKCim 1.5.2009, 10:09 |
из-за "или" имхо нельзя |
Автор: mes 1.5.2009, 10:16 | ||||
ну полностью задачу, так и не хотите осветить. Можно например 1. чтоб маска A включала в себя маски B и C, логичнее сказать для задачи использовать не { А, B, C }, а { ABC, B, C } 2. завести дополнительно исключающие маски :
тогда установка битов по маске будет провoдиться в два действия.
кстати выражение "пришла маска" имхо, не очень удачнoe, так как сама маска никуда не ходит, она сидит себе тихо и проверяет пришедшие значения на нужное сочетание битов. ![]() |
Автор: math64 1.5.2009, 10:29 | ||
Добавлено через 6 минут и 24 секунды Если disables сделать обычным (нестатичным), правила запретов можно менять динамически для каждого экземпляра |
Автор: zss 1.5.2009, 13:27 | ||||
ну смысл такой. Есть генератор файлов. Он поставляет файлы различных типов - либо они архивированные - либо нет. Но в один момент времени он поставляет файлы одного типа. Также в процессе работы он может поменять тип генерируемых файлов. 1. Неизвестный тип 2. Файл открыт 3. Файл архивирован 3.1. Архивирован Неизвестным архиватором 3.1. Zip 3.3. Rar Задача - описать генератор файлов. Сложность в том, что их одного файла определить этого нельзя. Нужно накапливать свойства. Усложняется еще и тем, что для пользователя Zip и Rar это схожие архиваторы (можно разархивировать одним приложением), но типы эти разные. То есть Zip дополняет Rar. Также можно определить, что файл архивирован, но непонятно чем. У меня получились следующие маски
и при получении файла осуществляется проверка
1. Если поставлялись закрытые файлы и пришел открытый, то просто меняется тип на OPEN 2. Если поставлялись открытые файлы и пришел закрытый, то сбрасывается флаг OPEN и взводится тип ARCHIVE. Если же известен тип архивации, то побитовая сумма. Вся сложность в том, что Rar и Zip могут быть вместе, но XXX с ними не должен быть. То есть возможные ситуации 1. XXX 2. Zip 3. Rar 4. Zip & Rar Но вот если поставлялись файлы XXX и вдруг пожли Zip или Rar, то может получиться ток 1. XXX & Zip 2. XXX & Rar 3. XXX & Zip & Rar что неправильно. Вывод: 1. Хотелось бы избавиться от операций проверки и ограничиться лишь побитовыми операциями. 2. Для этого нужно как-то организовать исключающие маски. З.Ы. И можно ли это вообще сделать без проверок ? Добавлено через 4 минуты и 2 секунды math64, что-то не понял как это решает мою задачу ? |
Автор: math64 1.5.2009, 13:59 | ||
Твою задачу это не решает, она сложнее. Можно сделать так:
|
Автор: mes 1.5.2009, 14:13 | ||||
можно если не создавать самому себе проблем ![]()
а может у пользователя вобще не будет WinRara, или такая версия которая любой архив одинаково легко раскроет ![]() А так как файл не знает ничего о приложении которое его будет открывать, он должен хранить только тип алгоритма. (т.е никаких сдвоенных масок) чтоб долго словами не объяснять, вот условный код того, как я вижу решение :
|
Автор: math64 1.5.2009, 14:20 |
Да, с классами код будет понятнее. |
Автор: zss 1.5.2009, 14:20 | ||
я лишь привел надуманный пример. Задача ставится именно для сдвоенных масок. Добавлено @ 14:21 необходимо различать типы xxx rar zip zip & rar Добавлено @ 14:22 xxx к тому же исключающий zip и rar |
Автор: mes 1.5.2009, 16:21 | ||
ну так приводите реальные примеры, что мешает приподнять занавесу таинственности ? ![]() Кому и для чего необходимо ? Поподробней. ![]() |
Автор: zss 1.5.2009, 16:26 | ||
ну разве это имеет значение. Я лишь обозвал тепло - мягким. На суть это не влияет(и на решение задачи тоже) |
Автор: mes 1.5.2009, 16:41 |
Если считатете, что тут сидят телепаты Вы ошибаетесь (по крайней мере я пока таких не встречал), и если надеетесь получить ответ от кого нибудь из форумчан, то проявите усердие и поставьте задачу ясно. Тут идет вопрос не о программисте или заказачике и не об их личных данных ![]() |
Автор: zss 1.5.2009, 16:48 |
задача была поставлена четко. Есть тип А, B и C. B и C могут существовать вместе как побитовая сумма, а А нет. Причем А исключает существование В и С. Необходимо реализовать это исключение битовыми операциями. Вроде все понятно. А пример приводился для наглядности (я уже пожалел, что его привел ![]() |
Автор: mes 1.5.2009, 16:59 | ||
Наверно это : есть три константы, каждая из которых представлена одним битом.
тут вроде понятно. Т.е есть битовый набор который может принимать только определенные комбинации. А вот тут абсолютно непонятно. Вот есть число n. Как именно с ним реализовать это исключение ? ![]() Наверно имелось ввиду, что при добавлении битовой констаты к набору(т.е при операции OR), исключающие биты должны обнулиться ? В таком случае ответ был дан еще тут : http://forum.vingrad.ru/index.php?showtopic=257653&view=findpost&p=1857621 |
Автор: zss 1.5.2009, 17:06 | ||
типа того ![]() Ты давно понял что я хочу ![]() |
Автор: mes 1.5.2009, 17:24 | ||
ну так подходит решение или нет ?
если нет, то чего в нем не хватает ? Добавлено через 4 минуты и 51 секунду А понял что Вам надо.. сейчас |
Автор: zss 1.5.2009, 17:38 | ||
то что в данно случае нужно будет проводить проверки.
а хотелось бы накладывать маску, которая сама контролирует взаимное исключение |
Автор: mes 1.5.2009, 17:51 | ||
вот опять условным кодом:
исправлено так пойдет ? |
Автор: math64 1.5.2009, 18:07 |
Выбирай из трёх вариантов: 1. Пиши ifы, как собирался сам. 2. Составляй таблицу Rule rules[], как предлагал я. Возможно struct Rule будет сложнее, для хранения их можно выбрать какой нибудь контейнер stl, который позволит быстрее найти нужную/-ые запись/-и. 3. Пиши набор классов Archivator, как предложил mes. 4. ЭКЗОТИКА: Выбрать другой язык программирования типа LISP или Prolog или запрограммировать ПЛМ. Врядли можно придумать что-то ещё. IMHO, вариант mes лучше |
Автор: zss 1.5.2009, 19:22 | ||||
value == eC, а должен == eB | eC
value == 0, а должен == eB | eC |
Автор: mes 1.5.2009, 19:45 |
из за написания на скорую руку, код содержал глюки - вот подправил А так применять нельзя, так как eB это не маска, а значение типа. Чтоб можно было за раз устанавливать оба бита, то можете добавить в список тип eBC с необходимыми масками. К тому же приведенный код лишь демонстрация и для заключительной версии требует доработки ![]() Добавлено через 5 минут и 25 секунд это тоже неправильное примение, так как как присваиваете набору значение типа.. Добавлено через 6 минут и 54 секунды Поэтому лучше подобные вещи разгружать через типы, а не значения. Тогда можно будет определить те операции которые требуется и компилятор сам будет следить за коректностью. |
Автор: math64 1.5.2009, 19:54 | ||||||||||||
По коду mes (1.5.2009, 17:51)
Так нельзя, eВ и eC - номера битов, их нельзя оъбединять по или
или
Добавлено через 14 минут и 27 секунд Вот тебе код без if:
|
Автор: KEHT 3.5.2009, 21:16 | ||
Минус реализации, что если тебе нужно будет, чтобы A = 00000001 B = 00000010 C = 00000011 С замещала B, то придеца указать B запрещающую маску 00000011, а это приведет к блокированию A Как вариант использовать vector<T>(или другой контейнер) для хранения масок |
Автор: math64 4.5.2009, 07:52 |
Идея неплохая, но в реализации operator |= и operator | есть ошибки, нужно вычислять новую disallowed_mask и mask вычисляется не всегда правильно. Можно добавить friend T operator |(const T&, const Mask&); чтобы искючить ненужное вычисление disallowed_mask. |
Автор: KEHT 4.5.2009, 11:24 | ||||||
Я исходил из условия задачи, в котором следовало, что объект справа от оператора подается на вход левому, поэтому и disallowed_mask оставлял от левого объекта.
Тут да. В данной реализации к типу T предъявляются довольно существенные ограничения. Идеально было бы хранить контейнер со всем запрещенными масками.
Я так понял, что по условию задачи левый от оператора объект предъявляет требования к правому, поэтому скорее friend T operator |(const Mask&, const T&); |
Автор: J0ker 4.5.2009, 18:26 | ||
|
Автор: zss 4.5.2009, 19:04 |
J0ker, и как их пользовать ? |
Автор: J0ker 4.5.2009, 19:22 | ||||
|
Автор: mes 4.5.2009, 19:56 | ||||
zss, ловите идею, может пригодится :
блок с 13й по 26ю строку можно записать примерно так :
подправлено забытое, в связи с замечанием J0ker'а |
Автор: J0ker 4.5.2009, 20:12 |
6: #undef DECLARE_TYPE |
Автор: zss 5.5.2009, 07:02 |
J0ker, идея хорошая, только у тебя нет исключающего архива. |
Автор: math64 5.5.2009, 08:26 | ||
с соответствующими упрощениями TypeSet. |
Автор: J0ker 5.5.2009, 09:02 | ||||
то есть? все комбинации в моем варианте заведомо верны или вы это имели ввиду:
|
Автор: Static 5.5.2009, 14:21 | ||
Позвольте вопрос...
Ведь если файл zip, rar или unknown_archive - он ведь все равно архив... |
Автор: zss 5.5.2009, 14:31 |
архив xxx, который не может существовать с zip и rar |
Автор: J0ker 5.5.2009, 16:10 | ||
ну как-же нет ARCHIVE |
Автор: zss 5.5.2009, 16:31 |
нет - ARCHIVE говорит что он закрыт, но возможно неизвестным архиватором - это не тип архива а тип - автоматически должен подразумевать архивацию |
Автор: J0ker 5.5.2009, 17:01 |
ARCHIVE с учетом не выставленных ZIP и RAR говорит об этом совершенно прямолинейно |
Автор: zss 5.5.2009, 17:32 | ||
это понятно. нужно сто 3 архив xxx исключал их. весь вопрос именно в этом |
Автор: J0ker 5.5.2009, 17:36 | ||||
|
Автор: mes 5.5.2009, 17:41 | ||||
J0ker,
|
Автор: J0ker 5.5.2009, 17:54 | ||
для этого к флагам прилагаются функции можно засунуть все это в класс от битовых флагов в чистом виде такого поведения добиться невозможно |
Автор: zss 5.5.2009, 19:57 | ||
ну mes приводил не плохое решение. наверное на этом и остановимся ![]() всем спасибо |
Автор: math64 6.5.2009, 12:49 | ||||
А теперь, какая самая простая реализация Set<Bit>? int (или short, unsigned char...). А Map<Bit, Set<Bits> >? int[Other+1].
|