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

Поиск:

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


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


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

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



Цитата(zss @  1.5.2009,  15:26 Найти цитируемый пост)
На суть это не влияет(и на решение задачи тоже) 

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

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

Тут идет вопрос не о программисте или заказачике и не об их личных данных  smile 






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


Опытный
**


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

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



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

задача была поставлена четко.

Есть тип А, B и C. B и C могут существовать вместе как побитовая сумма, а А нет.
Причем А исключает существование В и С. Необходимо реализовать это исключение битовыми операциями.

Вроде все понятно. А пример приводился для наглядности (я уже пожалел, что его привел smile).
PM MAIL ICQ   Вверх
mes
Дата 1.5.2009, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(zss @  1.5.2009,  15:48 Найти цитируемый пост)
задача была поставлена четко.


Цитата(zss @  1.5.2009,  15:48 Найти цитируемый пост)
Есть тип А, B и C.

Наверно это :  есть три константы, каждая из которых представлена одним битом.

Цитата(zss @  1.5.2009,  15:48 Найти цитируемый пост)
B и C могут существовать вместе как побитовая сумма, а А нет. Причем А исключает существование В и С. 

тут вроде понятно. Т.е есть битовый набор который может принимать только определенные комбинации.


Цитата(zss @  1.5.2009,  15:48 Найти цитируемый пост)
Необходимо реализовать это исключение битовыми операциями.

А вот тут абсолютно непонятно. 
Вот есть число n. Как именно с ним реализовать это исключение ?  smile 

Наверно имелось ввиду, что при добавлении битовой констаты к набору(т.е при операции OR), исключающие биты должны обнулиться ?
В таком случае ответ был дан  еще тут : http://forum.vingrad.ru/index.php?showtopi...t&p=1857621



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


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


Опытный
**


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

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



Цитата(mes @  1.5.2009,  16:59 Найти цитируемый пост)
Наверно имелось ввиду, что при добавлении битовой констаты к набору(т.е при операции OR), исключающие биты должны обнулиться ?

типа того smile терминология для второй страницы топика, я думаю, не совсем уместна.
Ты давно понял что я хочу smile
PM MAIL ICQ   Вверх
mes
Дата 1.5.2009, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(zss @  1.5.2009,  16:06 Найти цитируемый пост)
Ты давно понял что я хочу smile 


ну так подходит решение или нет ?
Цитата(mes @  1.5.2009,  15:59 Найти цитируемый пост)
 http://forum.vingrad.ru/index.php?showtopi...t&p=1857621

если нет, то чего в нем не хватает ?

Добавлено через 4 минуты и 51 секунду
Цитата(zss @  1.5.2009,  16:06 Найти цитируемый пост)
Ты давно понял что я хочу smile 

А понял что Вам надо.. сейчас 

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


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


Опытный
**


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

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



Цитата(mes @  1.5.2009,  17:24 Найти цитируемый пост)

если нет, то чего в нем не хватает ?

то что в данно случае нужно будет проводить проверки.

Код

if (value & Mask_A)
{
   ....
}
else if (value & (Mask_B | Mask_C))
{
   ....
}


а хотелось бы накладывать маску, которая сама контролирует взаимное исключение
PM MAIL ICQ   Вверх
mes
Дата 1.5.2009, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



вот опять условным кодом:  
Код

enum EBits { eA, eB, eC, eMax }; // это выражаясь вашей терминологии значения "типов"
const int Mask[]  = { 1<<eA, 1<<eB, 1<<eC }; // это их маски для хранения в контейнере
const int XMask[] = { /* eA */  Mask[eB] | Mask[eC],     // исключающие маски
                      /* eB */  Mask[eA],
                      /* eC */  Mask[eA]  };
void AddBit (int& set, int bit) // процедура корректного добавления "значения типа"  к "набору"
{
    if (bit >= eMax) return;
    set &= ~XMask[bit];
    set |= Mask[bit];
};
bool HasBit (int& set, int bit) // проверка на нахождение в "наборе" нужного значения типа.
{
      if (bit >= eMax) return false;
      return set & Mask[bit];
};

исправлено 

так пойдет ? 

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


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


Эксперт
****


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

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



Выбирай из трёх вариантов:
1. Пиши ifы, как собирался сам.
2. Составляй таблицу Rule rules[], как предлагал я.
Возможно struct Rule будет сложнее, для хранения их можно выбрать какой нибудь контейнер stl, который позволит быстрее найти нужную/-ые запись/-и.
3. Пиши набор классов Archivator, как предложил mes.
4. ЭКЗОТИКА: Выбрать другой язык программирования типа LISP или Prolog или запрограммировать ПЛМ.
Врядли можно придумать что-то ещё.
IMHO, вариант mes лучше
PM   Вверх
zss
Дата 1.5.2009, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(mes @  1.5.2009,  17:51 Найти цитируемый пост)
так пойдет ? 

Код

    int value = eA;
    AddBit(value, eB);
    AddBit(value, eC);

value == eC, а должен == eB | eC

Код

    int value = eA;
    AddBit(value, eB | eC);

value == 0, а должен == eB | eC
PM MAIL ICQ   Вверх
mes
Дата 1.5.2009, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(zss @  1.5.2009,  18:22 Найти цитируемый пост)
value == eC, а должен == eB | eC

из за написания на скорую руку, код содержал глюки - вот подправил

Цитата(zss @  1.5.2009,  18:22 Найти цитируемый пост)
AddBit(value, eB | eC);

А так применять нельзя, так как eB это не маска, а значение типа. 
Чтоб можно было за раз устанавливать оба бита, то можете добавить в список тип eBC с необходимыми масками.
К тому же приведенный код лишь демонстрация  и для заключительной версии требует доработки smile

Добавлено через 5 минут и 25 секунд
Цитата(zss @  1.5.2009,  18:22 Найти цитируемый пост)
 int value = eA;

это тоже неправильное примение, так как как присваиваете набору значение типа..

Добавлено через 6 минут и 54 секунды
Поэтому лучше подобные вещи разгружать через типы, а не значения.
Тогда можно будет определить те операции которые требуется и компилятор сам будет следить за коректностью. 

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


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


Эксперт
****


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

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



По коду mes (1.5.2009, 17:51)
Код

void AddBit (int set, int bit) // процедура корректного добавления "значения типа"  к "набору"
{
    if (bit >= eMax) return;
    set &= ~XMask[bit]; // В XMask биты которые нужно снять, а не оставить
    set |= Mask[bit];
};


Код

    int value = eA;
    AddBit(value, eB | eC);

Так нельзя, eВ и eC - номера битов, их нельзя оъбединять по или
Код

    int value = Mask[eA];
    value = AddBits1(value, Mask[eB] | Mask[eC]);

или
Код

    int value = Mask[eA];
    value = AddBits2(value, eB, eC, -1);

Код

int AddBits1(int set, int mask) {
  for (int i = 0; i < eMax; i++)
     if ( (mask & Mask[i]) != 0)
       AddBit(set, i);
  return set;
}
int AddBits2(int set, ...) {
  va_list v;
  va_start(v, mask)
  for (;;) {
    int i = va_arg(v, int); 
    if (i < 0)
      break;
    AddBit(set, i);
  }
  va_end();
  return set;
}


Добавлено через 14 минут и 27 секунд
Вот тебе код без if:
Код

int Table[64];
void InitTable() {
  for(int i = 0; i < 8; i++)
    for (int j = 0; j < 8; j++) {
       Table[i*8+j] = AddBits1(i, j);
    }
}

int AddBits3(int set1, int set2) {
  return Table[set1*8+set2);




Это сообщение отредактировал(а) math64 - 1.5.2009, 19:59
PM   Вверх
KEHT
Дата 3.5.2009, 21:16 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

#include <iostream>
#include <cassert>
using namespace std;
/*Класс T представляет тип маски и требует выполнения следующих условий
    1)Наличие конструктора по умолчанию
    2)Наличие копирующего конструктора
    3)Наличие оператора присваивания
    4)Наличие оператора сравнения
    4)Наличие функций для побитовых операций
*/
/*
Каждому объекту задается disallowed_mask. Если объект, подаваемый на вход содержится в этой маске,
то значения объекта замещается.
*/
template<typename T> class Mask;

template<typename T>
class Mask{
    T mask, disallowed_mask;
public:
    Mask(): mask(), disallowed_mask(){}
    Mask(const Mask &m): mask(m.mask), disallowed_mask(m.disallowed_mask){}
    Mask(T _mask, T _disallowed_mask): mask(_mask), disallowed_mask(_disallowed_mask){}
    Mask& operator=(const Mask &r){
        if(this != &r){
            mask = r.mask;
            disallowed_mask = r.disallowed_mask;
        }
        return *this;
    }
    //Бинарные операторы
    friend const Mask operator|(const Mask &l, const Mask &r){
        if(r.mask == (r.mask & l.disallowed_mask))
            return r;
        else
            return Mask(l.mask | r.mask, l.disallowed_mask);
    }
    Mask& operator|=(const Mask &r){
        if(r.mask == (r.mask & disallowed_mask) && this != &r)
            mask = r.mask;
        else
            mask |= r.mask;
        return *this;
    }
    //Функции доступа
    T get() const{ return mask; }
};

int main(){
    Mask<int> a(1, 4), b(2, 4), c(4, 3);
    
    assert((a | b).get() == 3);
    assert((a | c).get() == 4);
    assert((c | a).get() == 1);
    assert((b | c).get() == 4);
    assert((c | b).get() == 2);
    assert((c | c).get() == 4);
    
    return 0;
}


Минус реализации, что если тебе нужно будет, чтобы 
A = 00000001
B = 00000010
C = 00000011

С замещала B, то придеца указать B запрещающую маску 00000011, а это приведет к блокированию A

Как вариант использовать vector<T>(или другой контейнер) для хранения масок
PM MAIL   Вверх
math64
Дата 4.5.2009, 07:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Идея неплохая, но в реализации operator |= и operator | есть ошибки, нужно вычислять новую disallowed_mask и mask вычисляется не всегда правильно.
Можно добавить friend T operator |(const T&, const Mask&); чтобы искючить ненужное вычисление disallowed_mask.
PM   Вверх
KEHT
Дата 4.5.2009, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

нужно вычислять новую disallowed_mask

Я исходил из условия задачи, в котором следовало, что объект справа от оператора подается на вход левому, поэтому и disallowed_mask оставлял от левого объекта.
Цитата

mask вычисляется не всегда правильно

Тут да. В данной реализации к типу T предъявляются довольно существенные ограничения. Идеально было бы хранить контейнер со всем запрещенными масками.
Цитата

Можно добавить friend T operator |(const T&, const Mask&); чтобы искючить ненужное вычисление disallowed_mask.

Я так понял, что по условию задачи левый от оператора объект предъявляет требования к правому, поэтому скорее
friend T operator |(const Mask&, const T&);


Это сообщение отредактировал(а) KEHT - 4.5.2009, 14:05
PM MAIL   Вверх
J0ker
Дата 4.5.2009, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

enum MASKS
{
    UNKNOWN = 0x00000000,
    OPEN         = 0x00000001,
    ARCHIVE    = 0x10000000,
    ZIP             = 0x30000000,
    RAR            = 0x50000000,
    ZIP_RAR     = 0x70000000
}




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


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

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