J'ai des octets à la fonction de chaîne binaire,
std::string byte_to_binary(unsigned char byte) { int x = 128; std::ostringstream oss; oss << ((byte & 255) != 0); for (int i = 0; i < 7; i++, x/=2) oss << ((byte & x) != 0); return oss.str(); }
4 Réponses :
Quelque chose comme ça devrait fonctionner (bien que je l'ai piraté rapidement et que je n'ai pas testé):
Le code portable doit utiliser char_bit code> au lieu de codage dur
8 code> et maintenez le résultat dans
std :: Taille_t code> au lieu de
int code>.
Je vais simplement poster cela comme une réponse. Il est plus court, plus sûr et ce qui est le plus important, il est sortie: p> 00000011 P>
blockQuote> Nom de la fonction changé, bien que je ne suis pas content de celui-là ... Toute personne a eu une bonne idée? P> P>
Merci, BTW avez-vous obtenu cette sortie de Big Endian ou Little Endian OS?
+1 Si vous généralisez cela dans un modèle de fonction utilisant Tailleof (t) code> comme argument de modèle sur
std :: bitset <> code> afin qu'il fonctionne avec d'autres types d'intégrale.
@ildjarn: Fait, et merci à vous, j'ai remarqué un bogue. Un octet est un peu char_bit, pas 4 bits. :)
@parc: petit-Endian, comme la plupart des OS sur X86-64. Jetez un coup d'œil à Wikipedia pour une liste
Oh, et j'ai aussi ajouté de Sfinae pour la sécurité, dans une macro pour la brièveté. Sue moi pour ça. :)
Alors, l'endiangité n'affecte pas du tout l'ordre, peut-être que je vais y aller.
@parc: Ouais, il semble bitset code> prend en charge cela.
Que Sfinae manque un :: type code> avant l'astérisque.
Peut-être que dectobits ou quelque chose?
Vous pouvez le faire en utilisant STD: Bitset et convertir n'importe quel numéro en une chaîne de bits de n'importe quelle taille, par exemple 64
#include <string> #include <iostream> #include <bitset> using namespace std; int main() { std::bitset<64> b(836); //convent number into bit array std::cout << "836 in binary is " << b << std::endl; //make it string string mystring = b.to_string<char,char_traits<char>,allocator<char> >(); std::cout << "binary as string " << mystring << endl; }
Puisque vous avez mentionné votre souhait de style C dans les commentaires, vous pouvez envisager d'utiliser itoa A> (ou _itoa) si vous n'êtes pas inquiet de la norme ANSI-C forte>. De nombreux compilateurs le soutiennent à Stdlib.h. Il insigne également les 0 premiers 0: unsigned char yourGoldenNumber = 42;
char binCode[64];
itoa(yourGoldenNumber,binCode,2); // third parameter is the radix
puts(binCode); // 101010
Eh bien, alors la question est de savoir pourquoi n'utilisez-vous pas
std :: bitset code>?
Parce que j'utilise des bittes-opérateurs.
@parc: et
bitset code> les surcharge. Prochaine raison?
@parc: Vous utilisez
ostringingstream code> et
string code>, vous codez donc clairement en C ++. Utilisez des classes C ++ pour les trucs qu'ils sont faits. Prochaine raison? : P Cela peut sembler un peu dur, mais vous serez reconnaissant plus tard.
Je vais les convertir pour utiliser des tableaux de caractère plus tard.
@ Parc65: Si vous voulez une réponse C, vous devriez le dire explicitement dans votre question et baliser la question avec
C code> plutôt que
c ++ code>.
@parc: Pourquoi es-tu si réticent à utiliser
std :: bitset code>? Il est même constructible à partir de votre
octet code> !! (Vous devrez peut-être faire attention à l'endianess cependant.)
Oui, cela pourrait être la raison pour laquelle je n'utilise pas Bitset car il gâche avec une endianesse.
@parc: Ne cherchez pas soudainement des excuses. Essaye-le. En outre, je pense que mon commentaire précédent sur l'endianesse aurait pu être une erreur. Encore une fois, Testez-le B>.