Bitweis signierter Divisionsalgorithmus in C

8

Nun, um ehrlich zu sein, ist das eigentlich meine Hausaufgabe, wo ich einen Algorithmus implementieren muss, der in der Lage sein muss, zwei Werte zu teilen, ohne die absoluten Werte für die Division zu nehmen. Es muss auch den Rest herausfinden.

Der Dividend ist derjenige mit einem größeren absoluten Wert und der Teiler hat einen kleineren absoluten Wert.

Ich habe viel gegoogelt, aber die meisten Beispiele decken nur vorzeichenlose Werte ab.

Ich habe versucht, es durch das in der ersten Antwort erwähnte Schema umzusetzen: Implementieren Sie die Division mit einem bitweisen Operator Das hat mich aus irgendeinem Grund nicht sehr weit gebracht.

Dann habe ich folgendes gefunden: Ссылка Ich habe es funktioniert, als ich den Code unten mit dem Beispiel am Ende des Dokuments schrieb.

Dieser bekommt es richtig, wenn der erste Wert positiv ist und der zweite nicht.

Ich habe jetzt mindestens zwei Tage daran gearbeitet. Vielleicht kann jemand sagen, wo ich falsch liege.

Hier ist der Code, den ich mit Hilfe von @Dysaster zusammengestellt habe. Es funktioniert nicht, wenn beide Werte entweder negativ oder positiv sind, aber ich habe es geschafft, 20 von 25 dafür am Schutz zu bekommen.

%Vor%     
Raidok 09.06.2011, 16:33
quelle

1 Antwort

2

Sieht so aus, als ob die Beschränkung, die absoluten Werte nicht zuzulassen, groß ist. Es ist möglich, den Code zu ändern, den Sie leicht haben, um den Fall dort Rg1 & gt; 0 und Rg2 & lt; 0 zu behandeln.

Statt den absoluten Wert der negativen Zahl zu verwenden, ändern Sie einfach die Zeichen an Stellen, an denen Rg2 verwendet wird - und ändern auch die Zeichen am Ausgang. Du scheinst so angefangen zu haben, aber vergisst das bisschen Negieren deines Divisors (was in Rg3 übrig bleibt, nachdem du fertig bist). Sie können dies auf zwei Arten tun: Halten Sie den Algorithmus so, wie er ist, aber setzen Sie nach den acht Iterationen Rg3=(Rg3^0xff + 1) . Anstatt in 0 für negative und 1 für positive Werte zu verschieben, können Sie sie auch in der Hauptschleife umkehren, indem Sie 1 verschieben, wenn r negativ ist, andernfalls 0 (dies entspricht der impliziten Berechnung von Rg3 ^ 0xff ) und 1 addieren nach den acht Iterationen. Um zu sehen, warum Sie das Plus 1 benötigen, teilen Sie 1 durch -2, und sehen Sie, dass r immer negativ bleibt - wodurch alle 1 s in Rg3 verschoben werden. Nach acht Iterationen haben Sie 0xff (oder -1), aber es sollte 0 sein. Also fügen Sie 1 hinzu.

Übrigens gibt es einen Fehler in bits function. Die Zeile char bit = 0x80 sollte unsigned char bit = 0x80 lesen, da ein vorzeichenbehaftetes Zeichen vom Wert 0x80 zu 0xC0 wird, wenn es nach rechts verschoben wird - und das bringt Ihre Bitwerte durcheinander.

Jedenfalls. Ich weiß nicht, wie man den Fall von Rg1<0 behandelt, ungeachtet des Vorzeichens von Rg2 . Ich werde die Antwort aktualisieren, wenn mir etwas einfällt. Am Ende muss Ihre Abteilung einen der vier Algorithmen auswählen, um den Job auszuführen, abhängig vom Vorzeichen jedes Eingabeparameters.

BEARBEITEN:

Ich bin mir nicht sicher, wie ich das genau erklären soll, aber für den Fall von Rg1<0 , Rg2>0 besteht die Lösung einfach darin, den Anfangswert von r auf 0xff zu ändern und die Vorzeichenüberprüfung von% zu ändern. co_de% unten unter r . Das Ergebnis für r >= 0 ist -19/8 und für -2*8-3 ist -29/4 . Wenn Sie möchten, dass der Rest immer positiv ist, müssen Sie 1 von Rg3 subtrahieren und Rg2 zu r hinzufügen.

Ich wählte -7*4-1 initial value, weil 0xFF einfach die Vorzeichenerweiterung von r auf 16 Bits ist. Da Rg1 jetzt immer negativ ist, ist es nur natürlich, zu überprüfen, ob es nach dem Hinzufügen von r Null oder positiv wird.

Sie können den Fall von Rg2 , Rg1<0 ganz einfach handhaben: Setzen Sie einfach die Zeichen von Rg2<0 operations wieder zurück. Es kann auch möglich sein, die vier verschiedenen Routinen zu einer zu kombinieren, die alle vier Fälle behandelt, aber das überlasse ich Ihnen auch. :)

    
vhallac 09.06.2011, 20:08
quelle