2013-05-03 2 views
1

Edit2: Ребята, извините, но я нахожу, что это раздражает, что ответ отмечен как дубликат, не проверяя, действительно ли он решает проблему. Предлагаемый ответ SO не соответствует заявленной проблеме. Это фиксированное число переменных по сравнению с переменным числом переменных + переменная комбинация диапазонов целых чисел и целочисленных значений. Если вы все еще думаете в правильном направлении, пожалуйста, предоставьте действительное решение моей заявленной проблемы или просто не отмечайте его просто как дубликат, если вы не можете этого сделать.Помощник битмаски: создайте битмаску со списком списка int и int-range в C++

Я пытаюсь найти самый элегантный способ определения битовой маски. Эта битовая маска является целым числом и определяет видимость объектов на карте (32 уровня, поэтому бит 0..31 определяет видимость на каждом из 32 уровней).

Что я ideall хотел бы иметь:

INT visibilityMask = CreateVisibilityMask (0..12, 16, 22);

Таким образом, вышеизложенное будет представлять собой вариационную функцию, которая создает битовую маску, в которой необходимо перегрузить, чтобы создать битовую маску, которая затем будет OR'ed с другими значениями.

Я думаю, что это действительно тяжело. Но разве это невозможно?

Редактировать: Извините, ребята, но если вы считаете, что этот ответ является дубликатом предложенного вами ответа, пожалуйста, создайте пример того, как другой можно использовать в соответствии с моими потребностями. Предоставленный ответ не позволяет сочетать диапазон и значения одного int в переменной - если вы считаете, что это легко разрешить, предоставьте.

Примечание: Первоначальный вопрос касался перегрузки «..», что невозможно. Спасибо за разъяснение по этому поводу.

+5

№ '..' не является оператором. –

+2

Asnwer в основном такой же, как для [оператора двоеточия] (http://stackoverflow.com/questions/16339207/implementing-matlabs-colon-operator-in-c-expression-templates-class/16339594#16339594) - на самом деле * вопрос * в основном такой же. –

+0

Как насчет 'class range {public: range (int a, int b); } '? –

ответ

0

Я пытаюсь найти самый элегантный способ определения битовой маски.

Рассмотрение std::bitset вместо этого?

1

Нет, но вы можете сделать что-то вроде этого:

#define bitrange(from,to) (unsigned(-1) >> from << from << (sizeof(int)-to) >> (sizeof(int)-to)) 

int visibilityMask = bitrange(0,12) | 1<<16 | 1<<22; 

ОТВЕТ НА ОТЗЫВ НИТИ (это слишком долго для комментариев).

Я пишу исключительно в C + 11 сейчас. В основном это сложные библиотеки метапрограммирования.

Я бы использовал функцию constexpr самостоятельно в этом случае. Это несмотря на то, что я подал несколько ошибок consexpr с GCC и CLANG (gcc-54648, clang-13970).

Это был быстрый и грязный код, показывающий, как это сделать. И я написал «что-то вроде этого». Это тривиально переписать это с помощью constexpr для меня, но я не буду. Я написал это для OP, который, вероятно, не имеет C++ 11 complier и может не знать, что такое constexpr. OP не спрашивал о руководстве по стилю, он нуждался в решении. Если у вас есть лучшее решение, отправьте свой ответ.

+0

Если вы хотите сделать это на C++, я должен посоветовать вместо этого использовать функцию constexpr. Функционально то же самое, но, по крайней мере, это не уродливое определение, которое превосходит всю иерархию. Кроме того, смещение отрицательных чисел - это UB и, вероятно, не то, на что вы хотите положиться; особенно для такой простой задачи. – dascandy

+0

'constexpr' - это C++ 11, OP спрашивал о C++, а не о C++ 11. Для негативов вы правы. Я - добавил 'unsigned'. –

+2

Я считаю, что мы должны предположить C++ 11, если не указано иначе. – qdii