Estoy siguiendo un curso universitario sobre sistemas operativos y estamos aprendiendo cómo convertir de binario a hexadecimal, decimal a hexadecimal, etc. y hoy aprendimos cómo los números con signo / sin signo se almacenan en la memoria usando el complemento de dos (~ número + 1).
Tenemos un par de ejercicios que hacer en papel y me gustaría poder verificar mis respuestas antes de presentar mi trabajo al maestro. 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 memoria de a
, b
y c
.
Lo hice en papel y me da los siguientes resultados (todas las representaciones binarias en memoria de los números después del complemento de dos):
a = 00111010 (es un char, entonces 1 byte)
b = 00001000 (es un char, entonces 1 byte)
c = 11111110 11000101 (es un corto, entonces 2 bytes)
¿Hay alguna forma de verificar mi respuesta? ¿Hay una forma estándar en C ++ para mostrar la representación binaria en la memoria de un número, o tengo que codificar cada paso yo mismo (calcular el complemento de dos y luego convertirlo a binario)? Sé que esto último no llevaría tanto tiempo, pero tengo curiosidad por saber si hay una forma estándar de hacerlo.
fuente
std::hex
) manipulador - Lo dejaré como un ejercicio para que pueda resolver el resto ...Respuestas:
La forma más fácil es crear un
std::bitset
valor representativo y luego transmitirlo acout
.fuente
std::bitset
!+1
de mi parte.bitset
el argumento del constructor se interpreta como un valor sin signo, que funciona igual que el complemento de dos. Estrictamente hablando, C ++ no garantiza la aritmética del complemento a dos, y también la-58 >> 3
operación en su ejemplo no está definida.Utilice la conversión sobre la marcha a
std::bitset
. Sin variables temporales, sin bucles, sin funciones, sin macros.Live On Coliru
Huellas dactilares:
fuente
x
su uso:std::cout << std::bitset<8*sizeof(x)>(x)
.Si desea mostrar la representación en bits de cualquier objeto, no solo un número entero, recuerde reinterpretar primero como una matriz de caracteres, luego puede imprimir el contenido de esa matriz, como hexadecimal o incluso como binario (a través de un conjunto de bits):
Tenga en cuenta que los sistemas más comunes son little-endian, por lo que el resultado no
show_binrep(c)
es el 1111111 011000101 que espera, porque no es así como se almacena en la memoria. Si está buscando una representación de valor en binario, entonces un simple funciona.cout << bitset<16>(c)
fuente
No. No hay
std::bin
, likestd::hex
ostd::dec
, pero no es difícil generar un número binario usted mismo:Sacas el bit que está más a la izquierda enmascarando a todos los demás, desplazas a la izquierda y repites eso para todos los bits que tienes.
(El número de bits en un tipo es
sizeof(T) * CHAR_BIT
).fuente
Similar a lo que ya está publicado, solo usando bit-shift y máscara para obtener el bit; utilizable para cualquier tipo, siendo una plantilla (
solo que no estoy seguro si hay una forma estándar de obtener el número de bits en 1 byte, usé 8 aquí).fuente
CHAR_BIT
.Función reutilizable:
Uso:
Esto funciona con todo tipo de enteros.
fuente
fuente
int t = pow(2, num_of_bits - 1);
?Con la versión anterior de C ++, puede usar este fragmento:
fuente
Utilizando las respuestas std :: bitset y plantillas de conveniencia:
Usándolo así:
Genera salida:
fuente
Aquí está la verdadera forma de obtener una representación binaria de un número:
fuente
¿Es esto lo que estás buscando?
fuente
</argument>
. En serio, somos adultos, ¿sí? Casi revisé las edades en todos los comentarios aquí para asegurarme de que todos tenían más de 13 años.