Conversion binaire décimal [Résolu]

Messages postés
3
Date d'inscription
jeudi 15 mars 2007
Statut
Membre
Dernière intervention
1 avril 2007
- - Dernière réponse : cs_Laudrup
Messages postés
3
Date d'inscription
jeudi 15 mars 2007
Statut
Membre
Dernière intervention
1 avril 2007
- 1 avril 2007 à 18:55
Bonjour à tous,
je voulé savoir comment vous feriez pour faire un programe qui convertit un nombre binaire en un otr décimal pui pour afficher le décimal dans un Tedit. Je vi1 de débuT Delphi mé je maitrise pas encore bien lé fonctions du language. Je sé pa bien comment gérer les variables ni si on pe isoler chaque d'un mot de plusieur bit autremet qu'avec un masquage.

Merci d'avance et vive la comunauté Delphi
Afficher la suite 

7 réponses

Meilleure réponse
Messages postés
4200
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
26
3
Merci
avec les puissances c'est pas faux mais bonjour les performances ...

function Min(const A,B : integer) : integer;
begin
  if A < B then result := A else result := B;
end;

function BinStrToInt(const S : string) : integer;
var N,B,L : integer;
begin
  result := 0;
  B      := 1;
  L      := Min(Length(S),32);
  For N := L downto 1 do
  begin
    if S[N] = '1' then
       result := result + B;
    B := B + B;
  end;
end;

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 201 internautes nous ont dit merci ce mois-ci

Commenter la réponse de f0xi
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
5
3
Merci
tu peux aussi utiliser shl :

function BinaireToDecimal(binaire: string): integer;
var
  i, n, pwr : integer;
begin
  Result := 0;
  pwr := 1;
  n:= length(binaire);
  for i := 0 to n-1 do
  begin
    Result := Result + strToInt(binaire[n-i]) * pwr;
    pwr := pwr shl 1; // decalage binaire de pwr
  end;
end;

ou bien avec la condition :

function BinaireToDecimal(binaire: string): integer;

var

  i, n, pwr : integer;

begin

  Result := 0;

  pwr := 1;

  n:= length(binaire);

  for i := 0 to n-1 do

  begin
    if binaire[n-i] = '1' then
      Result := Result + pwr;

    pwr := pwr shl 1; // decalage binaire de pwr

  end;

end;

tu as 2 facons de modifier pwr :
 - soit tu fai comme j'ai mis:
pwr := pwr shl 1;
 - soit tu fait en fonction de i :
pwr := 1 shl i;

ce qui donne :
function BinaireToDecimal(binaire: string): integer;

var

  i, n : integer;

begin

  Result := 0;
  n:= length(binaire);

  for i := 0 to n-1 do

  begin

    if binaire[n-i] = '1' then

      Result := Result + (1 shl i);
  end;

end;

a toi de voir ...

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 201 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Guillemouze
Messages postés
4200
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
26
3
Merci
non avec shl ça pue du cul niveau perf, crois moi j'ai deja fait tout les tests possible pour avoir la meilleure performance.

la methode avec SHL mets plus de temps qu'avec de simple addition.

on peu meme faire ceci :

function Min(const A,B : integer) : integer;
begin
  if A < B then result := A else result := B;
end;

function IntelBinStrToInt(const S : string) : integer;
var N,B,L : integer;
begin
  result := 0;
  B      := 1;
  L      := Min(Length(S),32);
  For N := L downto 1 do
  begin
    if S[N] = '1' then
       result := result + B;
    B := B + B;
  end;
end;

function MotorolaBinStrToInt(const S : string) : integer;
var N,B,L : integer;
begin
  result := 0;
  B      := 1;
  L      := Min(Length(S),32);
  For N := L downto 1 do
  begin
    if S[N] = '1' then
       result := result + B;
    B := B + B;
  end;
end;

le calcul de B nous donne la table suivante :

bits 1..8 :
1,       
2,       
4,     
8,     
16,     
32,     
64,    
128,

bits 9..16 :
256,
512,
1024,  
2048,   
4096,   
8192,  
16384,  
32768

bits 17..24 :
65536,  
131072,  
262144,
524288,
1048576,
2097152,
4194304,
8388608

bits 25..32 :
16777216,
33554432,
67108864,
134217728,
268435456,
536870912,
1073741824,
2147483648 
ce qui est donc bon puisque la valeur de bit 32 High(Integer) ou encore la valeur de bit 32 * 2 high(cardinal)

et tout cela trés rapidement.

on pourrais meme faire ceci :

const  BinTable array[1..32] of integer (1,2,4,8,16,32,64,128,256,512,1024,2048,4096,
                                        8192,16384,32768, 65536,131072,262144,524288,
                                        1048576,2097152,4194304,8388608,16777216,33554432,
                                        67108864,134217728,268435456,536870912,1073741824,
                                        2147483648);

function Max(const A,B : integer) : integer;
begin
  if A > B then result := A else result := B;
end;

function Min(const A,B : integer) : integer;
begin
  if A < B then result := A else result := B;
end;

function IntelBinStrToInt(const S : string) : integer;
var N,LS,LE : integer;
begin
  result := 0;
  LS     := Length(S);
  LE     := Max(1, LS-32);
  For N := LS downto LE do
  begin
    if S[N] = '1' then
       result := result + BinTable[N];
  end;
end;

function MotorolaBinStrToInt(const S : string) : integer;
var N,LS,LE : integer;
begin
  result := 0;
  LS     := 1;
  LE     := Min(32, Length(S));
  For N := LS to LE do
  begin
    if S[N] = '1' then
       result := result + BinTable[N];
  end;
end;

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 201 internautes nous ont dit merci ce mois-ci

Commenter la réponse de f0xi
Messages postés
991
Date d'inscription
samedi 25 octobre 2003
Statut
Membre
Dernière intervention
29 août 2013
5
1
Merci
tout d'abord, avant d'apprendre le langage delphi, je pense que tu devrai apprendre le langage francais, ca serait un bon debut.

sinon, pour ton probleme, il existe peut etre une fonction preexistante, mais sinon tu peux faire quelquechose du genre :

function BinaireToDecimal(binaire: string): integer;
var
  i, n : integer;
begin
  n:= length(binaire);
  result := 0;
  for i := 0 to n-1 do
  begin
    result := result + strToInt(binaire[i+1]) * power(2, i);
  end;
end;
Commenter la réponse de Guillemouze
Messages postés
814
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
3
0
Merci
ah, ba oui. comme ça c'est mieux....

Loda
Se poser les bonnes questions est le premier pas pour trouver les bonnes réponses.
Commenter la réponse de cs_Loda
Messages postés
814
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
3
0
Merci
si tu veux causer optimisation,:
- met ta fct max en inline. (le compilo devrait le faire, mais bon mieux vaut préciser)
- il faudrait vérifier que le compilo sucre les var local LS, LE, sinon les enlever.

Loda
Se poser les bonnes questions est le premier pas pour trouver les bonnes réponses.
Commenter la réponse de cs_Loda
Messages postés
3
Date d'inscription
jeudi 15 mars 2007
Statut
Membre
Dernière intervention
1 avril 2007
0
Merci
Merci à tous pour ces réponses vous avez énormément fais avancer mon projet. Grace à vous tous j'ai pu avancer mon projet.
Voilà ce que j'ai fait avec votre aide pour la conversion:

procedure TForm1.Button1Click(Sender: Tobject) ;


var Nbr : integer  ;
var result: integer ;
var B: integer ;
var N: integer;
begin
  result := 0;
  B := 1; { le premier est a 1 }
  For N := Length(Edit1.Text) downto 1
  do begin                         { si le caractere a la position N est egal a 1 }
      if Edit1.Text[N] = '1' then
      result := result + B;        { alors on additionne Result avec la valeur courrante de B }
      B := B*2;                 { a chaque passage on additionne B avec lui meme }
  end;


  Nbr := StrToInt (Edit1.Text);
  Nbr := result;
  Label1.Caption := IntToStr (Nbr) ;
end;
Ca marche parfaitement encore merci. J'espère pourvoir soliciter à nouveau votre aide en cas de besoin.

ps: Excusez-moi pour l'orthographe.
Commenter la réponse de cs_Laudrup