2016-09-14 7 views
9

Ich war vertraut mit der berühmten Frage der Implementierung Multiplikation mit Addition oder Potenzierung mit Multiplikation, mit Algorithmen der Schleifenbildung oder Bit-Shifting und Hinzufügen von verschobenen Bitgruppen Combos.Implementieren von Addition mit Multiplikation

Nun fragte ich mich, ob es eine Möglichkeit ist zusätzlich zu implementieren nur höhere Level-Operationen verwendet wird, wie Multiplikation speziell oder Potenzierung, Logarithmus usw. (Subtraktion ausgeschlossen)

Kann dies mit einigem Algorithmus dieser Kombination erreicht werden Operationen (und möglicherweise bitweise Operatoren als Assistenten) oder ist Addition eine grundlegende Operation, die als Axiom dient, so dass es nicht anders als mit seiner Definition reproduziert werden kann?

Danke.

+8

Dies ist eine mathematische Frage ist, und ist nicht auf die Programmierung bezieht. – nwellnhof

+0

lesen Sie über Cauchy Produkt, vielleicht werden Sie einige Hinweise bekommen – Monah

+0

Ich bin kein Mathematiker, aber ich bin mir keiner solchen Sache bewusst. – duffymo

Antwort

7

Ja natürlich:

a + b = ln(exp(a) * exp(b))

bearbeiten: Hebe meine Augen über die Praktikabilität oben auf die mehr spekulativ, würde ich sagen, dass Sie sollten erwarten, dass höhere auszuführen unteren Level-Operationen durch . Solange die Operation auf höherer Ebene durch Operationen auf niedrigerer Ebene aufgebaut wird, sollten diese zumindest in der Lage sein, was ihre Bausteine ​​leisten könnten. Jedoch wahrscheinlich nicht auf eine einfache und direkte Weise, siehe den Kommentar unten. Ein Mensch kann Ihnen sagen, dass 1 + 1 = 2, aber es wäre viel billiger und sicherer, einen Computer oder ein noch einfacheres Gerät zu fragen.

+4

Bitte beachten Sie das Risiko von Überlauf und ungenaues Ergebnis bei Verwendung in realen Systemen. – Leon

+0

Was ist, wenn wir Operationen verwenden möchten, die tatsächlich implementierbar sind? – harold

+1

Nun, ln() und exp() sind natürlich implementierbar wie ln (exp (a) * exp (b)), aber wenn Sie "Implementable ohne Verwendung von Addition" meinen, dann reden wir im Grunde davon, Addition ohne Performance durchzuführen Zusatz. Das sollte wirklich hart sein. –

2

Nun, wenn Sie pedantisch darüber sein wollen, können zwei Zahlen in Binärdarstellung nur mit den bitweisen Operatoren OR, XOR und AND addiert werden, ohne dass irgendetwas "hinzugefügt" wird.

c n = a n XOR b n XOR tragen
carry = (a n: für die Summe a + b = c, das n-te Bit kann folgendermaßen berechnet werden UND b n) OR ((a n XOR b n) UND tragen)

Und Sie von c sollte ourse vermeiden n ++ verwenden, wenn sie über die Bits laufen, und in ein paar Multiplikationen für eine gute Maßnahme werfen:

int add(int a, int b) { 
    int c = 0; 
    char carry = 0; 
    for (int mask = 1; mask; mask *= 2) { 
     char an = a & mask ? 1 : 0; 
     char bn = b & mask ? 1 : 0; 
     c |= (an^bn^carry) * mask; 
     carry = an & bn | (an^bn) & carry; 
    } 
    return c; 
} 
+1

Das ist nicht ganz pedantisch genug. Bitte definieren Sie "strikt hinzufügen". (Soweit ich das beurteilen kann, ähnelt das, was Sie mit den Bit-Operationen beschreiben, tatsächlich dem, was der Computer tatsächlich tut, wenn wir '+' drücken.) –

+0

Das ist eine eigensinnige Interpretation von 'Using Multiplication'/** nur ** _higher Ebenenoperationen, wie z. B. Multiplikation, or_ [transcendentals]. – greybeard

+1

@greybeard Ich habe die Worte "irgendein Algorithmus, der diese Operationen (und möglicherweise bitweise Operatoren) kombiniert" ganz wörtlich genommen :-) – m69

Verwandte Themen