BEARBEITEN: Ups, ich habe die Frage des Titels falsch gelesen. Multiplikator ist ebenfalls verboten.
Jedenfalls glaube ich, dass es gut ist, diese Antwort nicht für diejenigen zu löschen, die nicht wussten, wie man durch zwei Konstanten dividiert.
Die Lösung besteht darin, mit einer magischen Zahl zu multiplizieren und dann die 32 am weitesten links stehenden Bits zu extrahieren:
dividiere durch 3 entspricht der Multiplikation mit 1431655766 und dann der Verschiebung um 32 in C:
%Vor%Klingt wie Hausaufgaben:)
Ich Bild Sie können eine Funktion schreiben, die eine Zahl iterativ teilt. Z.B. Sie können modellieren, was Sie mit einem Stift und einem Stück Papier tun, um Zahlen zu teilen. Oder Sie können Shift-Operatoren und + verwenden, um herauszufinden, ob Ihre Zwischenergebnisse zu klein / groß sind und iterativ Korrekturen anwenden. Ich werde den Code aber nicht aufschreiben ...
Das ist sehr einfach, so einfach, ich werde nur auf die Antwort hinweisen -
Einfache boolesche Logikgatter (und, oder, nicht, xor, ...) tun keine Division. Trotz dieses Handicaps können CPUs spalten. Ihre Lösung liegt auf der Hand: Finden Sie eine Referenz, die Ihnen erklärt, wie Sie einen Divisor mit boolescher Logik erstellen und Code schreiben, um das zu implementieren.
Wie wäre es damit, in einer Art Python-ähnlichem Pseudocode? Es teilt die Antwort in einen ganzzahligen Teil und einen Bruchteil. Wenn Sie es in eine Gleitkommadarstellung konvertieren wollen, bin ich mir nicht sicher, wie das am besten funktioniert.
%Vor%Beachten Sie, dass dies bei negativen Zahlen nicht funktioniert. Um das zu beheben, müssen Sie den Algorithmus ändern:
%Vor%Konvertiere 1/3 in binär
also 1/3 = 0.01010101010101010101010101
und dann einfach "multiplizieren" mit dieser Zahl mit shifts und sum
Langsam und naiv, aber es sollte funktionieren, wenn ein exakter Divisor existiert. Zusatz ist erlaubt, oder?
%Vor%Die Erweiterung für Teilteiler wird dem Leser als Übung überlassen. Grundsätzlich Test für +1 und +2 denke ich ...