8
votes

Convertir entier en bits

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();
}


9 commentaires

Eh bien, alors la question est de savoir pourquoi n'utilisez-vous pas std :: bitset ?


Parce que j'utilise des bittes-opérateurs.


@parc: et bitset les surcharge. Prochaine raison?


@parc: Vous utilisez ostringingstream et string , 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 plutôt que c ++ .


@parc: Pourquoi es-tu si réticent à utiliser std :: bitset ? Il est même constructible à partir de votre octet !! (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 .


4 Réponses :


5
votes

Quelque chose comme ça devrait fonctionner (bien que je l'ai piraté rapidement et que je n'ai pas testé): XXX


1 commentaires

Le code portable doit utiliser char_bit au lieu de codage dur 8 et maintenez le résultat dans std :: Taille_t au lieu de int .



11
votes

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 fait . xxx

sortie:

00000011

Nom de la fonction changé, bien que je ne suis pas content de celui-là ... Toute personne a eu une bonne idée?


9 commentaires

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) comme argument de modèle sur std :: bitset <> 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 prend en charge cela.


Que Sfinae manque un :: type avant l'astérisque.


Peut-être que dectobits ou quelque chose?



2
votes

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;
}


0 commentaires