Pergunta

Estou fazendo uma aula de C ++ inicial e gostaria de converter cartas entre representações hexadecimais e binárias. Eu consigo imprimir os números hexadecimais usando:

for(char c = 'a'; c <= 'z'; c++){
    cout << hex << (int)c;
}

Mas não posso fazer o mesmo para o binário. Não há std::bin que posso usar para converter os números decimais em binário.

Foi útil?

Solução

Igual a:

for(char c = 'a'; c <= 'z'; c++){
        std::bitset<sizeof(char) * CHAR_BIT> binary(c); //sizeof() returns bytes, not bits!
        std::cout << "Letter: " << c << "\t";
        std::cout << "Hex: " << std::hex << (int)c << "\t";
        std::cout << "Binary: " << binary << std::endl;
    }

Outras dicas

Não há um manipulador de IO binário no C ++. Você precisa executar a cobertura manualmente, provavelmente usando operadores de troca de bits. A conversão real não é uma tarefa difícil, por isso deve estar dentro das capacidades de um iniciante no C ++ (enquanto o fato de que não está incluído na biblioteca padrão pode não ser :))

EDIT: Muitos outros colocaram exemplos, então vou dar meu método preferido

void OutputBinary(std::ostream& out, char character)
{
  for (int i = sizeof(character) - 1; i >= 0; --i)
  {
    out << (character >> i) & 1;
  }
}

Isso também pode ser potencialmente modificado para qualquer tipo numérico.

Para um pouco de variedade, você também pode fazê -lo usando uma tabela de pesquisa de 16 elementos.

Você pode escrever facilmente um mapeamento entre os Charachters hexáticos e seus binários 'nibbles':

std::string HexCharToNibble( char c ) {
switch (c) {
  case '0': return "0000";
  case '1': return "0001";
  //... fill in the rest
  case 'f': return "1111";
  default: assert(false); return "bad input";
};

Você pode fazer algo assim:

for(char c = 'a'; c <= 'z'; c++){
    // char is 8 bits.  print 4 bits
    // at a time, starting with the MSB
    for (int i = 4; i>=0; i-=4) {
        switch (((int)c >> i) & 0xf) {
            case 0:
                cout << "0000";
                break;
            case 1:
                cout << "0001";
                break;
            .
            .
            .
            case 0xf:
                cout << "1111";
                break;


        }
    }
}

Parece uma tarefa, caso em que você realmente deve pedir ajuda ao seu professor. Solicitar soluções para a lição de casa da Internet realmente não vai ajudá -lo a longo prazo (a menos que você esteja entrando no gerenciamento de projetos).

Respondendo a Chustar (o OQ'ER) nos comentários, eu teria que concordar que, se você entender como fazê -lo, como/por que funciona e como descobrir isso no futuro, então sim, isso seria uma coisa boa.

No entanto, a resposta que ele marcou "correto" coloca a mentira nesse argumento. Ele não contém nada além de código, precedido com as palavras "como assim". É bem claro que o que o OQ'ER estava procurando era não Para uma explicação, mas alguém escrever seu código para ele.

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