Pergunta

Eu preciso usar sinalizadores de bits com mais de 32 bits (33 para ser exato agora). Eu tentei e encontrei o std :: bitset não lida com mais de 32 bits (Ulong). Eu tenho que usar o vetor ou há uma maneira de fazer bitset para funcionar?

Estou limitado a C ++ 98 neste projeto, então não posso usar o Boost.

Obrigado.

Editar:

Eu gostaria de fazer algo assim:

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

Solução

Acabei de testar novamente std::bitset Com 65 bits e no meu Linux de 32 bits, funciona bem e como esperado.

Exceção notável é o to_ulong() Método que gera exceção se algum bit de conjunto seria truncado durante a conversão. Agora, penso nisso e isso é bastante óbvio: não há outra maneira de impedir que a aplicação obtenha dados truncados. E o comportamento também está documentado.


Para o Editar com interruptor/caixa. Por que voce precisa std::bitset então? Aparentemente, sua plataforma já suporta números de 64 bits - use -os. std::bitset foi projetado para ser usado como uma matriz de bits leve com alocação de memória estática. Não se destina a ser usado como substituto para o número.

Outras dicas

std::bitset deve trabalhar com tamanhos mais ou menos arbitrários - é não Normalmente limitado ao tamanho de um longo não assinado (embora possa parecer assim, porque existe um construtor que constrói um bitset baseado nos bits em um longo não assinado).

Se isso não funcionar, vector<bool> pode ser útil para você, embora você deva estar ciente de que é praticamente um vector apenas em nome - é não Realmente um contêiner (ou seja, não está em conformidade com os requisitos normais de contêiner).

Gostaria std::vector<bool> Trabalho para você? Pode ser redimensionado, é razoavelmente rápido e tem uma pequena pegada. Também faz parte do STL.

Você pode usar o to_string em seu bitset e encobrir -o de volta usando 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
    ...
}

Observe que o acima pode funcionar apenas até 64 bits.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top