Viele Wege führen nach Rom - gerade und ungerade
Also da in der Forumssuche so wenig zu finden ist, will ich mal ein paar Lösungen nennen (es gibt ja sooo viele). Damit die Forumssuche beim nächsten mal tatsächlich was findet. Gerade die eine gefundene Lösung ist ja überhaupt nicht zu empfehlen.
Welche Programmiersprache sollte es denn überhaupt sein? Nicht alle Lösungen sind in jeder Programmiersprache realisierbar.
(im folgenden ist X der zu testende DINT-Wert)
(1) Zunächst gibt es die quick-and-dirty-Lösung mit dem Speichern von X in einen Schmiermerkerspeicher (lokal oder global) und direkte Adressierung des niederwertigsten Bits (T LD0 / U L3.0). Auch in SCL mittels der AT-Sicht realisierbar.
(2) Dann gibt es die imho effizienteste Lösung, das niederwertigste Bit in das Statusbit A1 zu schieben (SRD 1) oder zu rotieren (RRD 1) und dann A1 abzufragen (U <>0 / U >0).
(das wurde so auch schon in Beitrag #6 empfohlen)
(3) Oder man kann das niederwertigste Bit mit einer Wordverknüpfung ausmaskieren (UD DW#16#1). Ist das Ergebnis = 0 dann war X gerade. Diese Lösung eignet sich zum Testen eines beliebigen Bits (auch das Vorzeichen!) in X (durch geeignete Wahl des Maskierwertes).
(4) X durch 2 dividieren und wieder mit 2 multiplizieren. Kommt dabei das gleiche Ergebnis raus wie X, dann ist X gerade.
(5) X durch 2 dividieren und den Divisionsrest betrachten (modulo): Rest = 0: X ist gerade / Rest = 1: X ist ungerade
(6) den AKKU um 31 Bits nach links schieben (SLD 31). Ist danach der AKKU = 0, dann war X gerade. Ist AKKU <> 0 (bzw. AKKU < 0), dann war X ungerade.
(7) den AKKU um 1 Bit nach rechts rotieren (RRD 1). Ist danach der AKKU < 0 (negativ), dann war X ungerade. AKKU >=0 (positiv), dann war X gerade.
(2a) Wenn man X nur testen will und X unverändert im Akku1 behalten will:
Code:
// der zu testende Wert ist im AKKU1
RRD 1 // niederwertigstes Bit --> A1
U <>0 // A1 --> VKE
RLD 1 // AKKU1 wiederherstellen
// AKKU1 und AKKU2 sind unverändert, die Information ob gerade oder ungerade steckt im VKE
// VKE = 0: der Wert in AKKU1 ist gerade / VKE = 1: der Wert im AKKU1 ist ungerade
Kennt jemand weitere Möglichkeiten? Gibt es Vielleicht sogar was über Umwandlung in Gleitkommazahl?
@WL7001
Sorry Wilhelm, daß ich Dir nicht gleich die Lösung präsentiert habe, doch gerade eine Stunde vorher
wurde mir nahegelegt, anderen Forumsteilnehmern auch mal eine Chance zur Antwort zu geben ...
Harald