Raz jeszcze BinToDec - lepszy pomysł

Odpowiedz Nowy wątek
2010-02-24 12:59
0

Cześć, napisałem sobie funkcję BinToDec, ale wg mnie można napisać jakąś, która dużo mniej obciąży procesor, chociaż może jestem w tym momencie nadgorliwy, ale myślałem też o assemblerze, jednak moja wiedza ogranicza się w tej kwestii do zera ;)

Moja funkcja wygląda tak:

function BinToDec(Bin: string): integer;
var 
  i: integer;
  res: integer;
  exp: integer;
begin
  res:=0;
  exp:=0;

  for i:=length(bin) downto 1 do
  begin
    res:=res+StrToInt(bin[i])*Trunc(power(2, exp));
    exp:=exp+1;
  end;

  result:=res;  
end;

Da się coś z tym zrobić, żeby było mniej operacji?
A może właśnie assembler?

Pozostało 580 znaków

2010-02-24 13:21
0
function BinToDec (Binary: string): cardinal;
var
  Exponent, Position: cardinal;
begin
  result:=0;
  Exponent:=1;
  for Position := Length(Binary) downto 1 do
  begin
    if Binary[Position] = '1' then
      result := result + Exponent;
    Exponent := Exponent shl 1;
  end;
end;
function BinToDec (Binary: string): cardinal;
var
  Position, Size: cardinal;
begin
  result:=0;
  Size := Length(Binary);
  for Position := Size downto 1 do
  begin
    if Binary[Position] = '1' then
      BinToDec := result + (1 shl (Size - Position));
  end;
end;

nie wiem które będzie szybsze


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij

Pozostało 580 znaków

2010-02-24 22:45
0

Wycięty z kol.pas

function Binary2Int( const Value: AnsiString ) : Integer;
var I: Integer;
begin
  Result := 0;
  for I := 1 to Length( Value ) do
  begin
    if Value[ I ] in [ '0'..'1' ] then
      Result := Result * 2 + Ord( Value[ I ] ) - Ord( '0' )
    else break;
  end;
end;

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0