Convertir chaine de caractère binaire en chaine de caractère décimale

jav974 - 21 août 2012 à 15:42
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 - 22 août 2012 à 20:19
Bonjour,

comme l'indique le sujet de mon post je souhaiterais convertir une chaine de caractère binaire en chaine de caractère décimale de sorte à ce que :

"0000000000000010" devienne "2"

Je souhaiterais cependant ne pas passer par des conversions de cette chaine binaire en nombre entier puis en chaine puisque le but étant de pouvoir représenter des nombres extrêmement grands (500000 bits par exemple...)

Je peine à utiliser les stringstream avec les différents flags, si vous pouviez me donner un coup de main,

merci d'avance,
jav974

5 réponses

yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
22 août 2012 à 17:47
Salut,

#include 
#include 

// Chaine
std::string s("0000000000000010");

std::cout << "Decimal : " << 
    std::bitset<sizeof(std::string)>(s).to_ulong() << std::endl;
std::cout << "binaire : " << 
    std::bitset<sizeof(std::string)>(s).to_string() << std::endl;
std::cout << "Hexa : 0x" << std::hex << 
    std::bitset<sizeof(std::string)>(s).to_ulong() << std::endl;
std::cout << std::dec << std::endl;

// Nombre
unsigned long dw = 0x00000002;

std::cout << "Decimal : " << dw << std::endl;
std::cout << "Hexa : 0x" << std::hex << dw << std::dec << std::endl;
std::cout << "binaire : " << 
    std::bitset<sizeof(unsigned long)*8>(dw).to_string() << std::endl;


bye...
0
Ce n'est pas du tout ce je que je souhaitais, le problème dans la solution que tu me proposes est la taille de bit que peut contenir un to_llong ou to_ullong ou n'importe quelle variante présente dans le bitset.

Merci tout de même d'avoir répondu, entre temps j'ai trouvé une solution. Elle sera dispo à cette url : mon bitset sur cppfrance
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
22 août 2012 à 19:15
Re

Il suffirait de segmenter ta chaine de bits qui est "plus longue" qu'un unsigned long et de recalculer la valeur décimale de 4 en 4 octets.
en faisiant en sorte que les 4 octets analysés soient toujours le DWORD de poids fort du QWORD en cours et ainsi de suite.

Ceci dit, la valeur décimale maximum que peut contenir un registre 64 bits n'est pas infini, donc la limite sera vite atteinte...

D'autre part, je ne comprend pas lorsque tu dis un nombre de 500000 bits ?
Pour avoir une valeur décimale aussi grande il va te falloir un calculateur de la nasa !

Dans les algos de compression, on peut avoir des chaines de bits assez longues mais on ne voudra jamais leur représentation décimale, on aura plutot une suite de DWORD au format hexadécimal, et on accumulera jamais leurs valeurs respectives pour en faire une représentation unique.

Pour information, quel est donc la finalité de ta demande ?
Un petit exemple peut être.

bye...
0
Merci pour ces précisions,

j'avais tout simplement besoin de tester mon code avec des chaines binaires dépassant les 64 bits et voir si tout était cohérent. Je te rejoins sur le point que représenter un nombre aussi grand sous format décimal n'a aucune utilité cependant ^^'

Je voulais juste compléter du mieux possible la classe que j'ai commencé à développer et qui n'a en soi aucun intérêt pratique ( comprendre que si les besoins de calculs sur de très grands nombres se faisaient ressentir, je ne garantis aucune des fonctionnalités qui y sont présentes (gmp par ex. ferait ce travail certainement bien mieux que la solution que je propose, je n'en doute pas) ).

Voilà tout.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
22 août 2012 à 20:19
OK,

bonne continuation.

bye...
0
Rejoignez-nous