Je suis un cours universitaire sur les systèmes d'exploitation et nous apprenons à convertir du binaire en hexadécimal, décimal en hexadécimal, etc. et aujourd'hui, nous venons d'apprendre comment les nombres signés / non signés sont stockés en mémoire en utilisant le complément à deux (~ nombre + 1).
Nous avons quelques exercices à faire sur papier et j'aimerais pouvoir vérifier mes réponses avant de soumettre mon travail à l'enseignant. J'ai écrit un programme C ++ pour les premiers exercices mais maintenant je suis bloqué sur la façon dont je pourrais vérifier ma réponse avec le problème suivant:
char a, b;
short c;
a = -58;
c = -315;
b = a >> 3;
et nous devons montrer la représentation binaire en mémoire de a
, b
et c
.
Je l'ai fait sur papier et cela me donne les résultats suivants (toutes les représentations binaires en mémoire des nombres après le complément à deux):
a = 00111010 (c'est un caractère, donc 1 octet)
b = 00001000 (c'est un caractère, donc 1 octet)
c = 11111110 11000101 (c'est un court, donc 2 octets)
Existe-t-il un moyen de vérifier ma réponse? Existe-t-il un moyen standard en C ++ d'afficher la représentation binaire en mémoire d'un nombre, ou dois-je coder chaque étape moi-même (calculer le complément à deux puis convertir en binaire)? Je sais que ce dernier ne prendrait pas autant de temps, mais je suis curieux de savoir s'il existe un moyen standard de le faire.
la source
std::hex
) manipulateur - je vais le laisser comme un exercice pour que vous puissiez résoudre le reste ...Réponses:
Le moyen le plus simple est probablement de créer un
std::bitset
représentant de la valeur, puis de le diffuser surcout
.la source
std::bitset
!+1
de moi.bitset
argument constructeur de @Jesse: est interprété comme une valeur non signée, ce qui équivaut au complément à deux. À strictement parler, C ++ ne garantit pas l'arithmétique du complément à deux, et l'-58 >> 3
opération dans votre exemple n'est pas définie.Utilisez la conversion à la volée en
std::bitset
. Pas de variables temporaires, pas de boucles, pas de fonctions, pas de macros.Live On Coliru
Tirages:
la source
x
utilisation:std::cout << std::bitset<8*sizeof(x)>(x)
.Si vous souhaitez afficher la représentation binaire de n'importe quel objet, pas seulement un entier, n'oubliez pas de réinterpréter d'abord comme un tableau de caractères, alors vous pouvez imprimer le contenu de ce tableau, en hexadécimal, ou même en binaire (via le jeu de bits):
Notez que la plupart des systèmes courants sont peu endiens, donc la sortie de
show_binrep(c)
n'est pas le 1111111 011000101 que vous attendez, car ce n'est pas ainsi qu'il est stocké en mémoire. Si vous recherchez une représentation de valeur en binaire, alors un simplecout << bitset<16>(c)
fonctionne.la source
Non, il n'y a pas
std::bin
, commestd::hex
oustd::dec
, mais ce n'est pas difficile de sortir un nombre binaire vous-même:Vous sortez le bit le plus à gauche en masquant tous les autres, décalage à gauche et répétez cela pour tous les bits que vous avez.
(Le nombre de bits dans un type est
sizeof(T) * CHAR_BIT
.)la source
Similaire à ce qui est déjà publié, en utilisant simplement le décalage de bits et le masque pour obtenir le bit; utilisable pour tout type, étant un modèle (
seulement je ne sais pas s'il existe un moyen standard d'obtenir le nombre de bits en 1 octet, j'en ai utilisé 8 ici).la source
CHAR_BIT
.Fonction réutilisable:
Usage:
Cela fonctionne avec toutes sortes d'entiers.
la source
la source
int t = pow(2, num_of_bits - 1);
?En utilisant l'ancienne version C ++, vous pouvez utiliser cet extrait:
la source
Utilisation des réponses et des modèles de commodité std :: bitset:
L'utiliser comme ceci:
Génère une sortie:
la source
Voici la vraie façon d'obtenir une représentation binaire d'un nombre:
la source
C'est ce que vous cherchez?
la source
</argument>
. Vraiment, nous sommes adultes, oui? J'ai presque vérifié les âges sur tout ce qui a été commenté ici pour m'assurer que tout le monde avait plus de 13 ans.