LINUX.ORG.RU

[C++][std::bitset][красотодрчрство] маска

 


0

1

Всем привет.

помогите пожалуйста разрешить пару вопросиков:

1. собсно этот код работает

const unsigned long BIT_MASK = 1280;
bistset<32> var;
...
if ( BIT_MASK == (var & std::bitset<32>(BIT_MASK)).to_ulong() )
...

но! он мягко говоря ппц ... существует ли нормальный путь проверить вхождение маски ... хотелось бы писать что нить вроде :

if ( var & BIT_MASK )
но нигде приемлемых решений не нашел =(

2. насколько расточительнее по скорости работы использовать bitset вместо ulong'а ?

Спасибо большое.

★★★

ну так сделай свой класс, переопредели оператор &...
насколько быстрее? не понравится перейдешь на ulong в том же самом классе...

anonymous2 ★★★★★
()

во 1-х я бы для начала сделал что-нибудь вроде typedef std::bitset<32> b32;

во 2-х для битсета определены конструктор из ulong и бинарный оператор &, возвращающий битсет.

Попробуй переписать с учётом этих замечаний, может понравится.

yoghurt ★★★★★
()

Зачем нужно брать std, когда хватает обычного массива? Бит в байте можно установить через x | (1<<bitnum), сбросить через x & (~ (1<<bitnum)). При этом номер байта для маскирования это результат целочисленного деления на 8, а номер бита это остаток от целочисленного деления на 8. Поделить на 8 можно сдвигом вправо на 3, получить остаток деления на 8 можно при помощи x & 7.

Absurd ★★★
()
Ответ на: комментарий от Absurd

> Бит в байте можно установить через ...

сбросить через ...

номер байта для маскирования это ...

номер бита это ...

Вот чтобы этими подробностями код не загораживать. ООП же!

yoghurt ★★★★★
()
Ответ на: комментарий от yoghurt

>Вот чтобы этими подробностями код не загораживать. ООП же!

Инкапсулировать можно на разном уровне. Зачем клиенту кода знать про внутренний битфак в классе RSAEncrypt ?

Absurd ★★★
()
Ответ на: комментарий от Absurd

если я правильно понял намек - рекомендуется сделать обертку на ulong, переопределив что нужно включая & чтобы писалось как хочется, при этом не юзая именно bitset, или std в целом? просто std и так уже используется на полную), да какой там std ... есть уже boost::spirit ^_^

во 2-х для битсета определены конструктор из ulong и бинарный оператор &, возвращающий битсет.

собсно используя конструктор и оператор & я и решаю проверку маски (первый кусок кода в стартовом меседже) , просто мне кажется расточительным перебором, учитывая что таких операций будет много: от 1к+ в минуту ...

fura13 ★★★
() автор топика
Ответ на: комментарий от fura13

>Рекомендуется сделать обертку на ulong, переопределив что нужно включая & чтобы писалось как хочется, при этом не юзая именно bitset, или std в целом? просто std и так уже используется на полную), да какой там std ... есть уже boost::spirit ^_^

ЕМНИП у Саттера в одной из статей рассматривается работа с массивами битов и он там пришел к выводу что sdt::bitset - неудачный класс. Не помню уже почему.

Absurd ★★★
()
Ответ на: комментарий от Absurd

>sdt::bitset - неудачный класс. Не помню уже почему.

Ниасилил?

slackwarrior ★★★★★
()
Ответ на: комментарий от fura13

> просто мне кажется расточительным перебором, учитывая что таких

операций будет много: от 1к+ в минуту ...

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

anonymous2 ★★★★★
()
Ответ на: комментарий от fura13

у людей тут mysql по 1к sql-запросов в секунду выполняет, а ты про биты какие-то, да ещё и в минуту

cobold ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.