Das hab ich gerade produziert: es lehnt an die schriftliche Division aus der Grundschule (verschlafen?) an, wie man sieht funzt dieses Verfahren auch in Binär. Es ist zwar Delphi-Code weil ich zum Testen nicht extra den µC proggen wollte, aber wens interessiert, der kanns ja in assembler übersetzen.
Code:
procedure TForm1.Button1Click(Sender: TObject);
var
r16, r18, r20:word;//r16=Dividend, r18=Divisor, r20=Ergebnis
i:byte; //Schleifenzähler
begin
r16:=StrToIntDef(Edit1.Text,1);//Dividend laden, bei Mist im Eingabefeld 1
r18:=StrToIntDef(Edit2.Text,1);//Divisor laden
while (r18<high(r16) shr 1) do //Divisor bis zum Anschlag...
r18:=r18 shl 1; //nach links schieben.
for i:=0 to 15 do begin //Schleife, für jedes Ergebnis-Bit
r20:=r20 shl 1; //Ergebnis weiterschieben
if (r16>=r18) then begin //wenns reinpasst...
r16:=r16-r18; //einmal subtrahieren ...
r20:=r20 or 1; //und ne Eins ins Ergebnis.
end; //Ende If.
r18:=r18 shr 1; //Divisor weiterschieben
end; //Ende Schleife.
r18:=StrToIntDef(Edit2.Text,1);//Divisor nochmal laden
while (r18>1) do begin //Ergebnis so oft...
r20:=r20 shr 1; //nach rechts schieben...
r18:=r18 shr 1; //...wie der Divisor lang ist.
end; //Ende Schleife.
Edit3.Text:=IntToStr(r20); //Ergebnis ausgeben.
end;
Das Ergebnis wird immer ABgerundet, wer will kann den Code ja so midifizieren dass er richtig rundet. Ich denke, für natürliche Zahlen oder Festkommawerte ist das eine praktische Lösung. Oder weiss jemand was schnelleres? Bitte posten!
mfG
cht
Lesezeichen