¿Cómo imprimir (usando cout) un número en forma binaria?

Resuelto Jesse Emond asked hace 13 años • 13 respuestas

Estoy siguiendo un curso universitario sobre sistemas operativos y estamos aprendiendo cómo convertir de binario a hexadecimal, de decimal a hexadecimal, etc. y hoy acabamos de aprender cómo los números con y sin signo se almacenan en la memoria usando el complemento a dos (~número + 1).

Tenemos un par de ejercicios que hacer en papel y me gustaría poder verificar mis respuestas antes de enviar mi trabajo al profesor. Escribí un programa en C++ para los primeros ejercicios, pero ahora no sé cómo puedo verificar mi respuesta con el siguiente problema:

char a, b;

short c;
a = -58;
c = -315;

b = a >> 3;

y necesitamos mostrar la representación binaria en la memoria de a, by c.

Lo he hecho en papel y me da los siguientes resultados (todas las representaciones binarias en memoria de los números después del complemento a dos):

a = 00111010 (es un carácter, entonces 1 byte)

b = 00001000 (es un carácter, entonces 1 byte)

c = 11111110 11000101 (es corto, entonces 2 bytes)

¿Hay alguna manera de verificar mi respuesta? ¿Existe una forma estándar en C++ de mostrar la representación binaria en la memoria de un número, o tengo que codificar cada paso yo mismo (calcular el complemento a dos y luego convertirlo a binario)? Sé que esto último no llevaría tanto tiempo, pero tengo curiosidad por saber si existe una forma estándar de hacerlo.

Jesse Emond avatar Sep 08 '11 21:09 Jesse Emond
Aceptado

Probablemente, la forma más sencilla sea crear una std::bitsetrepresentación del valor y luego transmitirlo a cout.

#include <bitset>
...

char a = -58;
std::bitset<8> x(a);
std::cout << x << '\n';

short c = -315;
std::bitset<16> y(c);
std::cout << y << '\n';
Jerry Coffin avatar Sep 08 '2011 14:09 Jerry Coffin

Utilice la conversión sobre la marcha a std::bitset. Sin variables temporales, sin bucles, sin funciones, sin macros.

Live On Coliru

#include <iostream>
#include <bitset>

int main() {
    int a = -58, b = a>>3, c = -315;

    std::cout << "a = " << std::bitset<8>(a)  << std::endl;
    std::cout << "b = " << std::bitset<8>(b)  << std::endl;
    std::cout << "c = " << std::bitset<16>(c) << std::endl;
}

Huellas dactilares:

a = 11000110
b = 11111000
c = 1111111011000101
r233967 avatar Mar 17 '2013 07:03 r233967

En C++20 puedes usar std::formatpara hacer esto:

unsigned char a = -58;
std::cout << std::format("{:b}", a);

Producción:

11000110

En sistemas más antiguos puedes usar la biblioteca {fmt} , std::formatbasada en. {fmt} también proporciona la printfunción que hace esto aún más fácil y eficiente ( Godbolt ):

unsigned char a = -58;
fmt::print("{:b}", a);

Descargo de responsabilidad : soy el autor de {fmt} y C++20 std::format.

vitaut avatar Dec 16 '2020 20:12 vitaut