Gerade oder Ungerade?

WL7001

Level-2
Beiträge
182
Reaktionspunkte
17
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

mir will einfach nix vernünftiges (und einfaches) einfallen um festzustellen, ob eine Zahl (DINT) gerade oder ungerade ist. Hat jemand einen Denkanstoss für mich?

Gruß Wilhelm
 
Wie würdest du denn in Mathematik eine gerade oder ungerade Zahl beschreiben? ...


...geht aber auch einfacher...
Gesendet von meinem GT-N7100 mit Tapatalk 2
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hmm, nun bin ich aber überrascht, daß ich auf Anhieb nichts in der Forumssuche finde... Ich hätte schwören können ...
Ich glaube, für diese Aufgabe brauchen wir eine FAQ. ;)

Da der TE nicht mehr online ist wird er die Forumssuche wohl auch nicht (mehr) nutzen.

Also mein Tip: das niederwertigste Bit auswerten
z.B. mit "SRD 1" in das Statusbit A1 schieben und mit "U ==0 oder U <>0" abfragen oder mit "UD DW#16#1" ausmaskieren

Harald
 
Doch da ist was zu finden, wenn auch nicht viel, uralter Beitrag würde ich sagen: http://www.sps-forum.de/showthread....ade-das-ist-hier-die-Frage?highlight=Ungerade

Danke für den Hinweis Ralle, der reicht völlig aus und enthält den Denkanstoß der mir gerade nich einfiel.

@all: Ich hatte natürlich vorher die Forensuche bemüht und ca. 1h gelesen, aber das was ich suchte habe ich nicht gefunden. Auf das "rechteste Bit" bin ich gerade eben nicht gekommen. Ist euch sicher völlig unbekannt, das einem eine recht einfache Lösung nicht einfällt.


Gruß Wilhelm
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
Zwei habe ich noch...

(8)(9) Kann/Darf man keine Vergleiche nutzen und keine Statusbits auswerten, dann kann man auch eine Sprungleiste oder die LOOP-Operation nutzen:
Code:
// (8)
      L    "X"
      UD   DW#16#1      // UW W#16#1 reicht auch
      SPL  ETAB
      SPA  EVEN         // gerade
      SPA  ODD          // ungerade
ETAB: NOP  0

// (9)
      L    "X"
      UD   DW#16#1      // UW W#16#1 reicht auch
      LOOP EVEN         // gerade
ODD:  NOP  0
...
EVEN: NOP  0

Harald
 
Hallo PN/DP,

scheinbar darf man Dich nicht provozieren....
Dann läufts Du ja zur Höchstform auf. ;)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
...
(2) Dann gibt es die imho effizienteste Lösung, ...
...
Sorry Wilhelm, daß ich Dir nicht gleich die Lösung präsentiert habe,
...
so hätte ich es auch gemacht.
und auch so geantwortet, wärst Du mir nicht zuvorgekommen :D
Kennt jemand weitere Möglichkeiten? Gibt es Vielleicht sogar was über Umwandlung in Gleitkommazahl?
Dein Denksportansatz macht mir viel Spaß, weiter so!
 
@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

Hallo Harald,

erst einmal herzlichen Dank für deine Ideensammlung, wirklich prima. Wird sicher einigen anderen bei entsprechender Fragestellung auch helfen.

Nur so zum Abschluß für mich: Ich hatte nicht nach einer Lösung gefragt, sondern um einen Denkanstoß gebeten, da ich gerade einen Hänger (also im Kopf meine ich :)) hatte.

Nochmals Danke, mein "Problemchen" wurde durch diesen Thread gelöst.

Gruß Wilhelm
 
Zurück
Oben