Pergunta

Por que o bitset armazena os bits na ordem inversa?Depois de lutar muitas vezes, finalmente escrevi este binário_to_dec.Poderia simplificar?

int binary_to_dec(std::string bin)
{
    std::bitset<8> bit;

    int c = bin.size();

    for (size_t i = 0; i < bin.size(); i++,c--)
    {
        bit.set(c-1, (bin[i]-'0' ? true : false));
    }

    return bit.to_ulong();
}
Foi útil?

Solução

Bitset armazena seus números no que você considera uma ordem "reversa" porque escrevemos os dígitos de um número em diminuindo ordem de significância, mesmo que os caracteres de uma string estejam organizados em aumentando ordem do índice.

Se escrevêssemos nossos números em ordem little-endian, você não teria essa confusão porque o caractere no índice 0 da sua string representaria o bit 0 do bitset.Mas escrevemos os nossos números em ordem big endian.Receio não conhecer os detalhes da história humana que levaram a essa convenção.(E observe que o endianness que qualquer CPU específica usa para armazenar números multibyte é irrelevante.Estou falando sobre o endianismo que usamos ao exibir números para humanos lerem.)

Por exemplo, se escrevermos o número decimal 12 em binário, obteremos 1100.O bit menos significativo está à direita.Chamamos isso de "bit 0." Mas se colocarmos isso em uma corda, "1100", o personagem no índice 0 dessa string representa o bit 3, não o bit 0.Se criarmos um bitset com os bits na mesma ordem dos caracteres, to_ulong retornaria 3 em vez de 12.

A classe bitset possui um construtor que aceita um std::string, mas espera que o índice do caractere corresponda ao índice do bit, então você precisa reverter a string.Experimente isto:

int binary_to_dec(std::string const& bin)
{
  std::bitset<8> bit(std::string(bin.rbegin(), bin.rend()));
  return bit.to_ulong();
}

Outras dicas

unsigned long binary_to_dec(std::string bin)
{
    std::bitset<sizeof(unsigned long)*8> bits(bin);
    return bits.to_ulong();
}

EDITAR:formatação e tipo de retorno.

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