Newsgroup: it.comp.lang.delphi
Titolo: conversione Binario to Decimale:un bel problema!

sto facendo un "semplice"(almeno per me non lo è affatto) programmino che
converta un dato da decimale a binario e viceversa!
per il 10to2 nessun problema,ma per passare dal 2 al 10...che problema!!!
vi posto il codice,magari riuscite a capire xchè non va (non so usare il
debug :(  )
ahh non fate caso al codice orrendo e agli splendidi nomi di variabili,è
tutta opera mia :D
variabili impostate:
I:integer;
S,potenza,risultato: extended;
codice:
If ListBox1.ItemIndex = 1 Then
  Begin
    risultato := 0;
    For I := length(Edit1.text) - 1 Downto 0 Do
    Begin
      char := strtoint(copy(edit1.text, I, 1));
      s := I;
       if I=0 then
       begin
       if char=1 then potenza:=char * 1;
      end
       else begin
            potenza := char * (power(2, S));
            risultato := risultato + potenza;
             end;
    End;
    edit2.text := floattostr(risultato);
  end;

Prova in questo modo, dovrebbe funzionare:
Var c1,v1,v2 : Integer;
begin
  v1 := 1;
  v2 := 0;
  For c1 := length(edit1.text) downto 1 do
  begin
    if (Copy(Edit1.text,c1,1)='1') then v2 := v2 + v1;
    v1 := v1*2;
  end;
  edit2.text := inttostr(v2);
end;
ciao
--
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
Per rispondere in privato rimouvere 1975 dall'indirizzo
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-

function Bin2Dec( Binario : String ) : Integer ;
var L : Integer ;
    I : Integer ;
begin
  Result := 0 ;
  L := Length( Binario ) ;
  for I := L downto 1 do
  begin
    Result := Result + (Ord(Binario[I]) - Ord('0')) shl (L-I);
  end ;
end ;
--
Walkie...@Libero.It (ICQ# 8143647)

 ha scritto nel messaggio
news:COdP6.1390$zb1....@news.infostrada.it...


function bin2dec(s:string):integer;
var i,j,k:integer;
begin
 j:=0; k:=length(s);
 for i:=k downto 1 do if s[i]='1' then inc(j,1 shl (k-i));
 Result:=j;
end;
Ciao, Sandro

 ha scritto nel messaggio
news:9ekjvh$3h9d4$1...@ID-43509.news.dfncis.de...


1 shl (k-i) vuol dire fare 1 * 2^(k-i) giusto?
1 * 2^(k-i) e' uguale a 2^(k-i)
--
Walkie...@Libero.It (ICQ# 8143647)

1 * 2^(k-i) e' uguale a 2^(k-i)
lapalissiano

lapalissiano
Ma non per tutti.
Ops... hai un neurone spento...
--
Walkie...@Libero.It (ICQ# 8143647)

 moltiplica 0 * 1... boooh :D
La tua toria e' corretta, il tuo codice di meno, te lo ripropongo in maniera
corretta
var risultato, i, char, ndx : Integer;
    potenza               : Integer;
begin
  risultato := 0; // risultato parziale
  ndx       := 0;  // Indica l'indice del numero che sto prendendo, questo
viene letto da DX a SX
For I := length(Edit1.text) Downto 1 Do // Il primo valore ha indice 1 e non
0
  Begin
    char := strtoint(copy(edit1.text, I, 1));
    potenza := char * (Round(power(2, ndx))); // moltiplico il singolo
valore per 2 elevato all'indice del numero
    risultato := risultato + potenza;
    ndx := ndx + 1;
  End;
  edit2.text := floattostr(risultato);
end;:
Nel tuo codice come esponente usavi la posizione del numero e questo era
corretto se lo leggevi da SX a DX, invece tu fai il contrario, l'ultimo
valore a destra e' il primo e' quello con esponente 0, il secondo da destra
e' quello con esponente 1, ed e' per questo che andando a ritroso con il
"for" incremento il valore "ndx".
Per il calcolo della potenza basta una sola operazione (2^NDX)*Num, dove NDX
e' l'indice del numero, NUM e' il singolo valore della cifra binaria (0
oppure 1).
Io avro' qualche difficolta' in italiano ma tu le hai in matematica, mi
proponi un calcolo del tipo 1*1 ( if char=1 then otenza:=char * 1;).
Riesempio (il codice che segue e' solo di contorno alla spiegazione e
potrebbe non essere sintatticamente corretto), facendo finta di
rappresentare le cifre del numero binario con i valori A[X], dove X e' un
valore compreso tra 0 e 4, otteniamo un qualcosa del tipo:
"A[0] A[1] A[2] A[3] A[4]"
il valore decimale sara': A[0]*2^4 + A[1]*2^3 + A[2]*2^2 + A[3]*2^1
+A[4]*2^0
che con dei numeri veri diventa
 "10100"
decimale = 1*2^4 + 0*2^3 + 1*2^2 + 0*2^1 + 0*2^0
fai un ciclo for che va dalll'ultima cifra alla prima (da quella di mino
peso a quella di maggior)
 For c1 := length(miastr) downto 1 do
andando dall'ultima cifra alla prima noti che l'esponente continua ad
incrementare, puoi fare un calcolo del tipo "Lunghezza_stringa -
Carattere_corrente" oppure utilizzare un valore esterno, nel primo caso
ottienti
     potenza := A[c1] * (power(2,Length(miastr)-c1));
nel secondo caso, fuori dal ciclo devi azzerare il valore dell'indice
dell'esponente: e poi fare un calcolo
    potenza := A[c1] * (power(2,indice));
    indice := indice + 1;
sommi i valori parziali e fine.
ottienti: i due casi:
  For c1 := length(miastr) downto 1 do
  begin
    potenza := A[c1] * (power(2,Length(miastr)-c1));
    somma := somma + potenza;
  end;
  indice := 0;
  For c1 := length(miastr) downto 1 do
  begin
    potenza := A[c1] * (power(2,indice));
    indice := indice + 1;
    somma := somma + potenza;
  end;
ciao (non continuo per non esagerare nel caos)
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
Per rispondere in privato rimuovere 1975 dall'indirizzo
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-

Ops... hai un neurone spento...
ops, hai un neurone solo

 1 shl (k-i) vuol dire fare 1 * 2^(k-i) giusto?
[...]
shl e' operatore sui bit che SHifta a Left (sinistra) i bit del primo
operando di tante posizioni quanto vale il secondo operando.
"The operations x shl y and x shr y shift the value of x to the left or
right by y bits, which is equivalent to multiplying or dividing x by 2^y;
the result is of the same type as x. For example, if N stores the value
01101 (decimal 13), then N shl 1 returns 11010 (decimal 26)."
Tipicamente si usa per moltiplicare / dividere per potenze di due. Da qui
la presenza nelle risposte al quesito. Alle quali aggiungo anche la mia
(visto che tanto l'avevo scritta per l'altro thread):
// codice non testato
// provare con numeri grandi per overflow
// inoltre, la gestione del segno dipende da quel che e' il numero
// in ingresso (Byte, Word, Integer, Cardinal...)
function BinToDec(Src: string): string;
var i: Integer;
    Res: Int64;
begin
  Res := 0;
  for i := 1 to Length(Src) do begin
    if Src[i] not in ['0', '1'] then
      raise EConvertError.Create(' Spiritoso! ');
    inc(Res, ord(Src[i]) - ord('0'));      // aggiunge 1 o 0
    Res := Res shl 1;                      // moltiplica per 2
  end;
  Res := Res shr 1;   // nel for c'e' una moltiplicazione di troppo
  Result := Format('%d', [Res]);
end;
Saluti
Paolo Arosio