Hier mal die optimale Lösung für Eingaben von 0 bis 7:
private static int compute(int n)
{
int a = (n >> 2) & 1;
int b = (n >> 1) & 1;
int c = (n >> 0) & 1;
int na = 1 - a;
int nb = 1 - b;
int nc = 1 - c;
int b0 = (na & nc) | (a & c) | b;
int b1 = (nb & nc) | (b & c) | na;
int b2 = nb | c | a;
int b3 = (a & nb & c) | (na & nc) | (na & b) | (b & nc);
int b4 = (na & nc) | (b & nc);
int b5 = (nb & nc) | (a & nb) | (a & nc);
int b6 = (na & b) | (a & nb) | (b & nc);
return
(b0 << 0) |
(b1 << 1) |
(b2 << 2) |
(b3 << 3) |
(b4 << 4) |
(b5 << 5) |
(b6 << 6);
}
Das kannst du ja jetzt verallgemeinern, so dass 8 und 9 auch noch funktionieren
Edit: Habe es hinbekommen, zwar nicht rechnerisch/algorithmisch (denn das würde Rahmen dieser Aufgabe sprengen), aber durch „Speichern“ der 10 Zahlen/ints im Programm- bzw. Datenspeicher. Ich dachte anfangs, es gäbe vielleicht ein einfaches Muster, das mir nicht auffiele.
Bei Bedarf kann ich euch den Assemblercode zeigen (sind auch nur 100 Zeilen).
Ich mag die Lösung. Für einen µC der wenige bytes Code nicht in den Speicher bekommt wahrscheinlich schon zu viel Rechenleistung, aber ich mag die Lösung.
Nur eine Frage, ich würde Erwarten dass die Polynom-Formel eben nicht exakt die Punkte trifft, sondern einen Nachkommafehler haben wird. Bei 7,99999999 kommt als Ganzzahl halt 7 heraus. Oder ist das auf Ganzzahlen optimiert?
ja, nur eben in Assembler, falls das wichtig sein sollte.
Bzw. Landeis Lösung (bzw. die von Sir Newton) könnte sehr kompliziert werden, weil der µC nicht multiplizieren kann. Das müsste ich wahrscheinlich aufwändig nachbilden.