Estou seguindo um curso universitário sobre sistemas operacionais e estamos aprendendo a converter de binário em hexadecimal, decimal em hexadecimal, etc. + 1)
Temos alguns exercícios para fazer no papel e eu gostaria de poder verificar minhas respostas antes de enviar meu trabalho ao professor. Eu escrevi um programa C ++ para os primeiros exercícios, mas agora estou empolgado com a forma de verificar minha resposta com o seguinte problema:
char a, b;
short c;
a = -58;
c = -315;
b = a >> 3;
e precisamos mostrar a representação binária na memória de a
, b
e c
.
Eu fiz isso no papel e me fornece os seguintes resultados (todas as representações binárias na memória dos números após o complemento dos dois):
a = 00111010 (é um caractere, então 1 byte)
b = 00001000 (é um caractere, então 1 byte)
c = 11111110 11000101 (é curto, portanto, 2 bytes)
Existe uma maneira de verificar minha resposta? Existe uma maneira padrão em C ++ para mostrar a representação binária na memória de um número ou eu mesmo tenho que codificar cada etapa (calcular o complemento de dois e depois converter em binário)? Eu sei que o último não demoraria tanto, mas estou curioso para saber se existe uma maneira padrão de fazê-lo.
fonte
std::hex
) manipulador - Vou deixar isso como um exercício para você trabalhar fora o resto ...Respostas:
A maneira mais fácil é provavelmente criar uma
std::bitset
representação do valor e transmitir isso paracout
.fonte
std::bitset
!+1
de mim.bitset
o argumento construtor é interpretado como um valor não assinado, que funciona da mesma forma que o complemento de dois. A rigor, o C ++ não garante a aritmética do complemento de dois e também a-58 >> 3
operação no seu exemplo é indefinida.Use a conversão on-the-fly para
std::bitset
. Sem variáveis temporárias, sem loops, sem funções, sem macros.Live On Coliru
Impressões:
fonte
x
uso:std::cout << std::bitset<8*sizeof(x)>(x)
.Se você deseja exibir a representação de bits de qualquer objeto, não apenas um número inteiro, lembre-se de reinterpretar como uma matriz de caracteres primeiro, então você pode imprimir o conteúdo dessa matriz, como hexadecimal ou mesmo como binário (via bitset):
Observe que os sistemas mais comuns são little-endian; portanto, a saída de não
show_binrep(c)
é a 1111111 011000101 que você espera, porque não é assim que é armazenada na memória. Se você está procurando representação de valor em binário, um simples trabalho.cout << bitset<16>(c)
fonte
Não. Não há
std::bin
, comostd::hex
oustd::dec
, mas não é difícil gerar um número binário:Você produz o bit mais à esquerda mascarando todos os outros, desloca para a esquerda e repete isso para todos os bits que você possui.
(O número de bits em um tipo é
sizeof(T) * CHAR_BIT
.)fonte
Semelhante ao que já foi publicado, basta usar deslocamento e máscara de bits para obter o bit; utilizável para qualquer tipo, sendo um modelo (
só não tenho certeza se existe uma maneira padrão de obter o número de bits em 1 byte, usei 8 aqui).fonte
CHAR_BIT
.Função reutilizável:
Uso:
Isso funciona com todos os tipos de números inteiros.
fonte
fonte
int t = pow(2, num_of_bits - 1);
?Usando a versão antiga do C ++, você pode usar este trecho:
fonte
Usando as respostas std :: bitset e os modelos de conveniência:
Usando assim:
Gera saída:
fonte
Aqui está a verdadeira maneira de obter uma representação binária de um número:
fonte
É isso que você está procurando?
fonte
</argument>
. Realmente, somos adultos, sim? Eu quase verificou as idades sobre tudo o que comentou aqui para garantir que todos foi mais de 13.