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
...
}
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.