Conversion binaire décimal [Résolu]

cs_Laudrup 3 Messages postés jeudi 15 mars 2007Date d'inscription 1 avril 2007 Dernière intervention - 21 mars 2007 à 23:12 - Dernière réponse : cs_Laudrup 3 Messages postés jeudi 15 mars 2007Date d'inscription 1 avril 2007 Dernière intervention
- 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 

8 réponses

Répondre au sujet
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 22 mars 2007 à 11:52
+3
Utile
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;

Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de f0xi
Guillemouze 1015 Messages postés samedi 25 octobre 2003Date d'inscription 29 août 2013 Dernière intervention - 22 mars 2007 à 13:45
+3
Utile
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 ...
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Guillemouze
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 22 mars 2007 à 16:07
+3
Utile
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;

Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de f0xi
Guillemouze 1015 Messages postés samedi 25 octobre 2003Date d'inscription 29 août 2013 Dernière intervention - 22 mars 2007 à 00:16
+1
Utile
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
cs_Loda 900 Messages postés vendredi 3 novembre 2000Date d'inscription 30 juillet 2009 Dernière intervention - 22 mars 2007 à 12:37
0
Utile
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
cs_Loda 900 Messages postés vendredi 3 novembre 2000Date d'inscription 30 juillet 2009 Dernière intervention - 23 mars 2007 à 10:57
0
Utile
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
cs_Laudrup 3 Messages postés jeudi 15 mars 2007Date d'inscription 1 avril 2007 Dernière intervention - 1 avril 2007 à 18:55
0
Utile
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
cs_Loda 900 Messages postés vendredi 3 novembre 2000Date d'inscription 30 juillet 2009 Dernière intervention - 22 mars 2007 à 09:06
-2
Utile
Salut Laudrup,

bienvenue sur DelphiFr!

@Guillemouze : le point n'est le niveau que tu as en français. le point est de faire un effort pour éviter les plus grosses fautes et de ne pas faire de "fautes volontaire" (language sms).

Sinon, je ne crois pas qu'il existe de fct prédéfinie pour les conversiont string-binaire to integer. mais japee en avait faite un ou deux je crois. Ta function est très bien et functionne surement parfaitement, mais je me permet quand même de corriger 1-2 détails:

function BinaireToDecimal(const binaire: string): integer;
var
  i : integer;
begin
  result := 0;
  for i := 1 to length(binaire) do
  begin
    if Binaire[i] = '1' then
      result := result + power(2, i-1);
  end;//for
end;


Comme t'es nouveau, voicic quelques liens qui devrait répondre à beaucoup de tes questions:

Nouveau sur le site:

Le menu du site propose beaucoup de rubrique! Tutoriels, codes, forums, Offre d'emploi, ...

Prend deux min pour le parcourir le menu.

Plus particulièrement, regarde ces pages:
http://www.delphifr.com/reglement.aspx
http://www.delphifr.com/annuaire.aspx?Cat =7
http://www.delphifr.com/tutorial_liste.aspx

Le règlement de ce site est simple et "normal". Stp, respect le!

Nouveau dans le monde Delphi:

Voici quelques liens utile pour débuter. A lire absolument (au moins en travers).
http://www.delphifr.com/tutoriaux/GUIDE-DEBUTANT-DELPHISTE_481.aspx
http://www.delphifr.com/tutoriaux/DELPHI-40-FONCTIONS-UTILES-CLASSEES-THEME_217.aspx
http://www.delphifr.com/tutoriaux/DELPHI-DECLARER-UTILISER-TYPES_177.aspx
http://www.delphifr.com/tutoriaux/CONVENTIONS-ECRITURE-IDENTIFIANTS-VARIABLES-METHODES-DELPHI_413.aspx

Rappelons que lire et comprendre des codes d'exemples est une excellent solution pour apprendre de nouvelle techniques!

Site de référence / cours / doc:

Autre site parlant  de Delphi
http://www.delphifr.com/annuaire.aspx?Cat= 7
et plus particulièrement
http://delphi.developpez.com/
http://delphi.about.com/
www.google.com  ;-)

Très bon Tutoriels / cours en anglais sur Les Technologie du web : HTML, SQL, PHP, script, svg, ... (et plein plein d'autres)
http://www.w3schools.com/
Très bon site orienté "web developer", indiquant également les standards en vigueur et méthodes "deprecated".

Autre Site d'intérêt:

Très bon article sur la netiquette, ou "Comment poser une question intelligente à la quel quelqu'un répondra"
http://www.gnurou.org/writing/smartquestionsfr

CommentCaMarche contient des informations sur l'informatique en général.
Facile d'accès, nécessitant très peu de pré requis. Excellent site pour débuter dans un nouveau domaine / sujet.

Wikipedia contient plus d'information que la plus part des gens pensent. hésite pas à chercher sur wikipedia!

aide pour l'orthographe française:


Erreur courantes, tips:

http://forum.hardware.fr/hfr/Discussions/Societe/cours-avant-avent-sujet_19265_1.htm#t0


rechercher l'orthographe d'un mot (saisie phonétique, bien sûr) :

http://atilf.atilf.fr/dendien/scripts/tlfiv4/showps.exe?p =combi.htm;java=no;


Pour corriger un texte (1200 caractères max. Ne pas abuser) :

http://orthonet.sdv.fr//pages/correction.html

Traducteur en ligne:

www.reverso.net

http://www.google.com/language_tools'hl=fr

Télécharger un compilateur Delphi:
http://delphi.developpez.com/freewares/borland/
http://www.codegear.com/Default.aspx?tabid=138

voilà. en espérant que cela t'aidera.

bon code,

Loda
Se poser les bonnes questions est le premier pas pour trouver les bonnes réponses.
Commenter la réponse de cs_Loda

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.