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> etstring 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 quec ++ code>.@parc: Pourquoi es-tu si réticent à utiliser
std :: bitset code>? Il est même constructible à partir de votreoctet 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>.