битовый набор для более чем 32 бит? - PullRequest
4 голосов
/ 31 августа 2010

Мне нужно использовать битовые флаги с более чем 32 битами (точнее, 33).Я попытался найти, что std :: bitset не обрабатывает более 32 бит (ulong).Нужно ли использовать вектор или есть способ заставить работать набор битов?

В этом проекте я ограничен c ++ 98, поэтому не могу использовать boost.

Спасибо.

Редактировать:

Я бы хотел сделать что-то вроде этого:

const uint64    kBigNumber = 1LL << 33;
std::bitset<33> myBitSet;
...
switch(myBitSet) {
    case kBigNumber:
    // do something
    ...
}

Ответы [ 4 ]

6 голосов
/ 31 августа 2010

std::bitset должен работать с более или менее произвольными размерами - он не обычно ограничен размером беззнакового long (хотя это может выглядеть так, потому что есть конструктор, который строит наборы на основе битов)на биты в беззнаковом длинном).

Если это не сработает, vector<bool> может быть полезным для вас, хотя вы должны знать, что это в значительной степени vector только по названию - это не действительно контейнер (т. е. не соответствует обычным требованиям к контейнеру).

5 голосов
/ 31 августа 2010

Будет ли std::vector<bool> работать на вас?Его можно изменить, он достаточно быстрый и занимает мало места.Это также часть STL.

4 голосов
/ 31 августа 2010

Я только что повторно протестировал std::bitset с 65 битами, и на моем 32-битном Linux он работает нормально и, как и ожидалось.

Заметным исключением является метод to_ulong(), который выдает исключение, если любой установленный битбыть усеченным во время преобразования.Теперь я думаю об этом, и это довольно очевидно: нет другого способа предотвратить усечение данных приложением.И поведение также задокументировано .


На Редактировать с помощью переключателя / регистра.Зачем тебе тогда std::bitset?Ваша платформа, видимо, уже поддерживает 64-битные числа - используйте их.std::bitset предназначен для использования в качестве облегченного битового массива со статическим распределением памяти.Он не предназначен для замены номера.

1 голос
/ 31 августа 2010

Вы можете использовать строку to_string для своего набора битов и скрыть ее обратно, используя strtoull

const uint64    kBigNumber = 1LL << 33;
std::bitset<33> myBitSet;
...
unsigned long long bitSetLong = strtoull(myBitSet.to_string<char,char_traits<char>,allocator<char> >().c_str(), NULL, 2);
switch(bitSetLong) {
    case kBigNumber:
    // do something
    ...
}

Обратите внимание, что вышеприведенное может работать только до 64 бит.

...