2010-07-17 8 views
11
int x = 5; 
cout<<(char)x; 

le code ci-dessus génère un int x en binaire brut, mais seulement 1 octet. ce que je besoin de faire est sortie x que 4 octets en binaire, parce que dans mon code, x peut se situer entre 0 et 2^32-1, depuiscomment générer un int en binaire?

ne fait pas l'affaire, comment je le ferais?

+2

Qu'importe? Il a posté ce qu'il essayait de faire jusqu'à présent et pourquoi son code ne fonctionnait pas et a posé une question claire. –

+0

Cela ne fonctionnera probablement pas bien avec 'cout', car vous n'avez aucun contrôle sur la façon dont il est ouvert. Si vous voulez faire une sortie binaire, ouvrez votre propre flux et incluez l'indicateur 'ios_base :: binary' dans votre argument' openmmode'. –

Répondre

9

Vous pouvez utiliser la fonction membre std::ostream::write():

std::cout.write(reinterpret_cast<const char*>(&x), sizeof x); 

Notez que vous voulez généralement de le faire avec un ruisseau qui a été ouvert en mode binaire.

+0

ok, je vais garder cela à l'esprit, merci! – user299648

2

Essayez:

int x = 5; 
std::cout.write(reinterpret_cast<const char*>(&x),sizeof(x)); 

Note: Ces données de writting au format binaire est non portable.
Si vous voulez le lire sur un autre ordinateur, vous devez avoir exactement la même architecture ou vous devez normaliser le format et vous assurer que toutes les machines utilisent le format standard.

Si vous voulez écrire binaire la meilleure façon de normaliser le format est de convertir les données au format réseau (il existe un ensemble de fonctions pour cette htonl() < -> ntohl() etc)

int x = 5; 
u_long transport = htonl(x); 
std::cout.write(reinterpret_cast<const char*>(&transport), sizeof(u_long)); 

Mais le format le plus transportable est de simplement convertir en texte.

std::cout << x; 
1

Quelques conseils. Tout d'abord, pour être compris entre 0 et 2^32 - 1, vous aurez besoin d'un non signé int oct.Deuxièmement, les quatre octets commençant à l'adresse de x (& x) ont déjà les octets que vous voulez.

Cela aide-t-il?

2

et pourquoi pas?

 
int x = 5; 
cout<<(char) ((0xff000000 & x) >> 24); 
cout<<(char) ((0x00ff0000 & x) >> 16); 
cout<<(char) ((0x0000ff00 & x) >> 8); 
cout<<(char) (0x000000ff & x); 

+0

Très probablement, c'est plus sur la bonne voie que les autres réponses - la question d'origine ne spécifie pas "écrire en binaire" * comment *. Si c'est «en quelque sorte en mémoire», c'est une chose, mais si vous essayez d'être compatible avec n'importe quoi d'autre, vous voudrez peut-être (par exemple) toujours écrire 32 bits dans l'ordre des octets du réseau, comme cette réponse fait (modulo quelques problèmes de compatibilité) – hobbs

24

Un peu en retard, mais, comme Katy montre dans son blog, cela pourrait être une solution élégante:

#include <bitset> 
#include <iostream> 

int main(){ 
    int x=5; 
    std::cout<<std::bitset<32>(x)<<std::endl; 
} 

Extrait de: https://katyscode.wordpress.com/2012/05/12/printing-numbers-in-binary-format-in-c/

+4

Probablement la réponse la plus raisonnable.Il suppose en quelque sorte que nous parlons d'un int 32 bits, mais nous formulons également de telles hypothèses dans presque toutes les autres réponses. – v010dya

+4

@ v010dya Vous pouvez faire quelque chose comme std :: bitset (ou std :: bitset ) pour éviter ces hypothèses. – Conchylicultor

+0

Je pense qu'il est important de noter que cette réponse ne répond pas à la question. – Tkdestroyer2