Moin!
Wenn die Minute 64 Sekunden hätte (tja...) sähe das so aus:
Stunden H = (SG & HM) >> 12
Minuten M = (SG & MM) >> 6
Sekunden S = SG & SMAber so einfach gehts nicht. Hast Du Lust da weiterzumachen, oder führt dieser Ansatz in eine Sackgasse?
Wie ich dir schon versuchte klarzumachen: Die Zahlenbasis 60 für die Sekunden und Minuten ist inkompatibel zur Zahlenbasis 2 des Computers. Mindestens was die Binärarithmetik und Bitoperationen angeht.
Der Trick von LX, um aus Einzelwerten für Stunde, Minute und Sekunde eine Sekundenanzahl zu machen, ist simpel: Ein Bitshift nach links entspricht einer Multiplikation mit 2. Statt also h*3600 + m*60 + s zu rechnen, bastelt er sich die Multiplikatoren (3600 und 60) durch Addition und Subtraktion von Zweiterpotenzen. Wobei schon das nicht in deinem eigentlichen Sinne sein dürfte, denn Addition und Subtraktion sind keine Bitoperationen.
Umgekehrt funktioniert das noch weniger.
Dir schwebt vor, einfach durch Ausblenden von Bits aus einer Sekundenanzahl die Zahlen für Stunden, Minuten und Sekunden zu ermitteln.
Funktioniert nicht so einfach. Bzw. die Lösung würde bestimmt sehr kompliziert und aufwendig, so dass eine Rechenlösung schneller ist (Benchmarking überlasse ich dir, genauso übrigens für die Vorwärtslösung von LX).
Aber das muss ohne Modulo gehen. wir haben v.l.n.r. 6 Bit für die Stunden, 6 Bit für die Minuten und 6 Bit für die Sekunden. Wenn da das Hin- und Hergeshifte vorher nicht gewesen wäre bräuchten wir nun Masken um die Zahlen da wieder rauszuziehen;
Die Sache ist: Wir haben keine 6 Bit für die Sekunden.
011111 - sind 31 Sekunden
100000 - sind 32 Sekunden
111111 - sind 63 Sekunden - also 3 Sekunden und 1 Minute.
111100 - sind 60 Sekunden - also exakt 1 Minute.
Wie man also sieht: Bit 5 auf 1 sagt absolut nichts über die Anzahl der Sekunden allein aus. Selbst Bit 0 sagt nichts über die Anzahl der Sekunden allein aus.
Du kannst natürlich wieder diese Bitshift-Operation anwenden, um durch 2 zu teilen, und dann Zwischenergebnisse speichern, wieder multiplizieren, und vom Ursprungswert abziehen, um ein Modulo zu simulieren. Denn anders kommst du nicht an die Zahl der Sekunden ran: s = t%60. Modulo ist eine komplexe Operation, die man nicht "mal eben" durch eine einzige oder sehr wenige Bitoperationen ersetzen könnte.
- Sven Rautenberg