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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> исключающие маски 
:(
    Опции темы
zss
Дата 30.4.2009, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



есть маски
Код

enym MASKS
{
    a = 0x00000001,
    b = 0x00000002,
    c = 0x00000004
}


они приходят в любой комбинации. Но маска "а", должна исключать маски "b" и "с".
То есть, если пришла "a", то "b" и "c" должны сброситься, или если пришла "b" или "c". то должна сброситься "a".

Можно ли их как организовать, чтоб при побитовом сложении осуществлялось это исключение. Или только руками проверять ?
PM MAIL ICQ   Вверх
mes
Дата 30.4.2009, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(zss @  30.4.2009,  21:36 Найти цитируемый пост)
enym

enum  smile 

Цитата(zss @  30.4.2009,  21:36 Найти цитируемый пост)
они приходят в любой комбинации. Но маска "а", должна исключать маски "b" и "с".
То есть, если пришла "a", то "b" и "c" должны сброситься, или если пришла "b" или "c". то должна сброситься "a".

Ничего не понял, что требуется. Присваивайте значение пришедшей маски, и предыдущее значение сбросится.



--------------------
PM MAIL WWW   Вверх
zss
Дата 30.4.2009, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(mes @  30.4.2009,  23:07 Найти цитируемый пост)
Присваивайте значение пришедшей маски, и предыдущее значение сбросится

как это так ?
PM MAIL ICQ   Вверх
mes
Дата 30.4.2009, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(zss @  30.4.2009,  22:09 Найти цитируемый пост)

как это так ? 

Как я понял у Вас есть переменная которая должна быть равна значению одной маски, а не их сочетанию.
Ну так присваивайте нужное значение и все. Или вопрос в чем то другом ? тогда перефразируйте плиз, чтоб можно было понять, чтоб Вам требуется.
Можно попробовать подкрепить вопрос примером.  smile 

Это сообщение отредактировал(а) mes - 30.4.2009, 23:22


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


Опытный
**


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

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



Цитата(mes @  30.4.2009,  23:22 Найти цитируемый пост)
Как я понял у Вас есть переменная которая должна быть равна значению одной маски, а не их сочетанию.

нет - "b" и "с" сочетаться могут
PM MAIL ICQ   Вверх
MAKCim
Дата 1.5.2009, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(zss @  30.4.2009,  22:36 Найти цитируемый пост)
если пришла "b" или "c"

из-за "или" имхо нельзя


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

PM MAIL   Вверх
mes
Дата 1.5.2009, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(zss @  30.4.2009,  23:33 Найти цитируемый пост)
нет - "b" и "с" сочетаться могут 

ну полностью задачу, так и не хотите осветить.
Можно например 
1. чтоб маска A включала в себя маски B и C, логичнее сказать для задачи использовать не { А, B, C },  а { ABC, B, C }
2. завести дополнительно исключающие маски :
Код

enum Mask
{
    Mask_A = 1 << 0,
    Mask_B = 1 << 1,
    Mask_C = 1 << 2,
    Mask_XA = Mask_B | Mask_C,
    Mask_XB=  Мask_A,
    Mask_XC = Mask_A
};


тогда установка битов по маске будет провoдиться в два действия. 
Код

bits &= ~XA; 
bits |=A;


Цитата(zss @  30.4.2009,  21:36 Найти цитируемый пост)
То есть, если пришла "a", то "b" и "c" 

кстати выражение "пришла маска" имхо, не очень удачнoe, так как сама маска никуда не ходит, 
она сидит себе тихо и проверяет пришедшие значения на нужное сочетание битов. smile



Это сообщение отредактировал(а) mes - 1.5.2009, 20:03


--------------------
PM MAIL WWW   Вверх
math64
Дата 1.5.2009, 10:29 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код

enum Bit {
bitA, bitB, bitC
};
enum Mask {
maskA = 1 << bitA,
maskB = 1 << bitB,
maskC = 1 << bitC
};

class BitCombination {
static int disables[];
int value;
public:
   BitCombination();
   BitCombination(const BitCombination&);
   BitCombination& operator=(const BitCombination&);
   int Value() { return value; }
   BitCombination& SetBit(Bit bit);
   BitCombination& SetBits(int bits);
   BitCombination& ClrBit(Bit bit);
};

int BitCombination::disables[] = { maskB | maskC, maskA, maskA };
BitCombination& BitCombination::SetBit(Bit bit) {
  value &= ~disables[bit];
  value |= 1 << bit;
  return *this;
}



Добавлено через 6 минут и 24 секунды
Если disables сделать обычным (нестатичным), правила запретов можно менять динамически для каждого экземпляра
PM   Вверх
zss
Дата 1.5.2009, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(mes @  1.5.2009,  10:16 Найти цитируемый пост)
ну полностью задачу, так и не хотите осветить.


ну смысл такой.
Есть генератор файлов. Он поставляет файлы различных типов - либо они архивированные - либо нет. Но в один момент времени он поставляет файлы одного типа. Также в процессе работы он может поменять тип генерируемых файлов.
1. Неизвестный тип
2. Файл открыт
3. Файл архивирован
    3.1. Архивирован Неизвестным архиватором
    3.1. Zip
    3.3. Rar

Задача - описать генератор файлов. Сложность в том, что их одного файла определить этого нельзя.
Нужно накапливать свойства.

Усложняется еще и тем, что для пользователя Zip и Rar это схожие архиваторы (можно разархивировать одним приложением), но типы эти разные. То есть Zip дополняет Rar. Также можно определить, что файл архивирован, но непонятно чем.

У меня получились следующие маски
Код

enum MASKS
{
    UNKNOWN = 0x00000000,
    OPEN         = 0x00000001,
    ARCHIVE    = 0x00000002,
    XXX            = 0x10000002,
    ZIP             = 0x20000002,
    RAR            = 0x40000002
}


и при получении файла осуществляется проверка
Код

if(value != UNKNOWN)
{
    if (value & ARCHIVE)
    {
        m_value &= ~OPEN;
        m_value |= value;
    }
    else m_value = OPEN;
}


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, что-то не понял как это решает мою задачу ?
PM MAIL ICQ   Вверх
math64
Дата 1.5.2009, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Твою задачу это не решает, она сложнее.
Можно сделать так:
Код

struct Rule {
int bitsSetted;  // Биты установленные в 1
int bitsCleared;// Биты сброшенные в 1
int bitsToSet;   // Биты, которые нужно установить в 1
int bitsToClear;// Биты, которые нужно сбросить в 1
int bitsCopyed;//  Биты, которые нужно скопировать
}; // Может быть нужны будут дополнительные поля
struct Rule[] rules = {
  // Написание кода заменяется на составление таблицы
  { ARCHIVE, UNKNOWN, ARCHIVE, OPEN, ARCHIVE | ZIP | RAR }
};
const countRules = sizeof(rules)/ sizeof(rules[0]);
// Или использовать array<Rule> rules;
void setBits(int& oldBits, int newBits)
{
   for (int i = 0; i < countRules; i++)
  {
    if ( (~newBits & rules[i].bitsSetted) == 0 &&
         (newBits & rules[i].bitsCleared) == 0 )
    {
      int toCopy = rules[i].bitsToCopy;
      oldBits = (oldbits & ~toCopy) | (newBits & toCopy);
      oldBits |= rules[i].bitsToSet;
      oldBits &= ~rules[i].bitsToClear;
    }
  }
}

PM   Вверх
mes
Дата 1.5.2009, 14:13 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(zss @  1.5.2009,  12:27 Найти цитируемый пост)
И можно ли это вообще сделать без проверок ? 

можно если не создавать самому себе проблем smile
Цитата(zss @  1.5.2009,  12:27 Найти цитируемый пост)
Усложняется еще и тем, что для пользователя Zip и Rar это схожие архиваторы (можно разархивировать одним приложением), но типы эти разные

а может у пользователя вобще не будет WinRara, или такая версия которая любой архив одинаково легко раскроет smile
А так как файл не знает ничего о приложении которое его будет открывать, он должен хранить только тип алгоритма. (т.е никаких сдвоенных масок)

чтоб долго словами не объяснять, вот условный код того, как я вижу решение :

Код

namespace File {
 namespace Archive {
   enum EType { eUnknown, еOpen, eZip, eRar, eXXX };
 } // Archive

  struct Descriptor
  {
      int ArchiveType;
  };
  
  struct Archivator 
  {
      virtual bool CanDecode (const Descriptor&) =0;
  };
} // File

struct WinRar : public File::Archivator
{

        virtual bool CanDecode (const Descriptor& d)  
        { 
            using namespace File::Archive;

            switch (d.ArchiveType)
            {                 
                    case еOpen  : 
                    case eZip   : 
                    case eRar   : return true; 
       
                   default : return false;
            };
        }
};  
}








Это сообщение отредактировал(а) mes - 1.5.2009, 14:16


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


Эксперт
****


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

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



Да, с классами код будет понятнее.
PM   Вверх
zss
Дата 1.5.2009, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(mes @  1.5.2009,  14:13 Найти цитируемый пост)
а может у пользователя вобще не будет WinRara, или такая версия которая любой архив одинаково легко раскроет smile
А так как файл не знает ничего о приложении которое его будет открывать, он должен хранить только тип алгоритма. (т.е никаких сдвоенных масок)

я лишь привел надуманный пример. Задача ставится именно для сдвоенных масок.

Добавлено @ 14:21
необходимо различать типы
xxx
rar
zip
zip & rar

Добавлено @ 14:22
xxx к тому же исключающий zip и rar

Это сообщение отредактировал(а) zss - 1.5.2009, 14:22
PM MAIL ICQ   Вверх
mes
Дата 1.5.2009, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(zss @  1.5.2009,  13:20 Найти цитируемый пост)
я лишь привел надуманный пример. Задача ставится именно для сдвоенных масок.

ну так приводите реальные примеры, что мешает приподнять занавесу таинственности  ? smile

Цитата(zss @  1.5.2009,  13:20 Найти цитируемый пост)
необходимо различать типы

Кому и для чего необходимо ? Поподробней.  smile 





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


Опытный
**


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

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



Цитата(mes @  1.5.2009,  16:21 Найти цитируемый пост)
ну так приводите реальные примеры, что мешает приподнять занавесу таинственности  ? 


Цитата(mes @  1.5.2009,  16:21 Найти цитируемый пост)
Кому и для чего необходимо ? Поподробней. 

ну разве это имеет значение.
Я лишь обозвал тепло - мягким.

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


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

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