¿Cómo imprimir (usando cout) un número en forma binaria?
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
, b
y 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.
Probablemente, la forma más sencilla sea crear una std::bitset
representació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';
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
En C++20 puedes usar std::format
para 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::format
basada en. {fmt} también proporciona la print
funció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
.