cs_Laudrup
Messages postés3Date d'inscriptionjeudi 15 mars 2007StatutMembreDernière intervention 1 avril 2007
-
21 mars 2007 à 23:12
cs_Laudrup
Messages postés3Date d'inscriptionjeudi 15 mars 2007StatutMembreDerniè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.
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202237 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;
Guillemouze
Messages postés991Date d'inscriptionsamedi 25 octobre 2003StatutMembreDernière intervention29 août 20136 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;
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202237 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;
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)
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;
Guillemouze
Messages postés991Date d'inscriptionsamedi 25 octobre 2003StatutMembreDernière intervention29 août 20136 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;
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_Loda
Messages postés814Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention30 juillet 20093 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.
cs_Laudrup
Messages postés3Date d'inscriptionjeudi 15 mars 2007StatutMembreDerniè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.