Ich habe vier Inputs die ich in eine Integerzahl umwandeln will: 1001
Ich habe die Formel gefunden:
int in = 0;
int D14_ = 1;//lowbit
int D15_ = 0;
int D16_ = 0;
int D17_ = 1;//highbit
in = ((D17_(2^3))+(D16_(2^2))+(D15_*(2^1))+D14_);
Bei der Formel schreibt der Arduino für in=2
Wenn ich die Formel so schreibe:
BTT = ((D17_(8))+(D16(4))+(D15_*(2))+D14_);
würde es stimmen, in=9
Habe ich das falsche Hochzeichen bzw.versteht der Arduino was anderes da drunter?
Sehr nice ist mir aber schon wieder zu hochgegriffen, außerdem erlaubte Datentypen float, Ergebnis double.
Mit meiner gefundenen Formel bin ich eigentlich schon zufrieden, sie funktioniert und braucht nicht viel Speicherplatz. Mich hat nur gewundert daß der Ardu das Hochzeichen nicht versteht.
Bei dem Beispiel ist die Erklärung in Klammern gewesen und in "normalem" Mathe geschrieben nicht in Arduino-verständlichem Programmtext. Dort ist das ^-Zeichen tatsächlich ein bitweises XOR und kein Potenz-Hochzeichen. Das hatte ich übersehen. Also vielen Dank an alle Beteiligten für die Infos!
Abgesehen vom Linksshiften, was hier einfacher und effizienter ist aber für Anfänger weniger verständlich.
Wieso willst Du vom Programm Zahlen ausrechnen lassen, die Du beim programmieren bereits kennst?
Wieso willst Du 2^3 ausrechnen lassen, wenn es 8 ist?
Jemand der sich besser mit dem Kompiler aukennt sollte sagen ob dieses Herumgerechne sich im kompilierten Code überhaupt noch befindet oder ob das der Kompiler schon ausgerechnet hat und nicht in den Code Eingang findet.
Wenn die Daten constexpr oder const sind, dann ist die Wahrscheinlichkeit groß, dass alles vorberechnet wird.
Aber wir dürfen ja nicht wissen wo die Daten her kommen.
Interessanter ist, ob der betreffende Rechner/µC einen Barrelshifter hat.
Wenn ja, dann ist sowas
int in = (D17_ << 3) + (D16_ << 2) + (D15_ << 1) + D14_;
völlig ok.
Ohne, z.B. bei den AVR, gibts bessere/schnellere Methoden.
Durchnummerieren von Variablen ist immer böse, darum das Array.
Das Template stellt sicher, dass quasi jedes Byte Array übergeben werden kann.
Unabhängig von der Größe N.
Und dass der Compiler aufschreit, wenn man versucht irgendetwas anderes zu übergeben.
Das macht die Sache Wiederverwendbar. for(const byte pin:pins) Der range based for loop, sollte mittlerweile bekannt sein.
Auch die kombinierten Operatoren finden sich im C++ Buch.
Natürlich könnte man das unsigned auch noch zu einem Template Parameter machen, damit man nicht auf die 16 oder 32 Bit beschränkt ist.