Conversion binaire décimal

Résolu
cs_Laudrup Messages postés 3 Date d'inscription jeudi 15 mars 2007 Statut Membre Dernière intervention 1 avril 2007 - 21 mars 2007 à 23:12
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
A voir également:

7 réponses

f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
22 mars 2007 à 11:52
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;

3
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
22 mars 2007 à 13:45
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 ...
3
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
22 mars 2007 à 16:07
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;

3
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
22 mars 2007 à 00:16
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;
1

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

Posez votre question
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 3
22 mars 2007 à 12:37
ah, ba oui. comme ça c'est mieux....

Loda
Se poser les bonnes questions est le premier pas pour trouver les bonnes réponses.
0
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 3
23 mars 2007 à 10:57
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.
0
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
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.
0
Rejoignez-nous