Servus! Ich habe folgendes Problem: ich habe einen 64 Bit Timestamp, den ich in einen 32 Bit Timestamp umwandeln möchte. Der 64 Bit ist in Millisekunden und der 32 Bit ist in Sekunden. Eigentlich ne einfache aufgabe, jedoch bin ich auf nem 8051 unterwegs und kann daher keinn 64 bit verarbeiten! Wie kann ich trotzdem den timestamp umwandeln (also durch 1000 teilen)? Vielen Dank für eure Hilfe!
Du kannst duch 1024 teilen, durch 1000 teilen wird aufwendig.
Stephan S. schrieb: > Eigentlich ne einfache aufgabe Eben, der Wertebereich der ganzen Sekunden im 64-Bit Timestamp passt nämlich nicht in 32-Bit, egal, wie du das auch berechnest. Oliver
No schrieb: > Du kannst duch 1024 teilen, durch 1000 teilen wird aufwendig. Na ja wenn das ein Zeitstempel ist der seit dem 1.1.1970 läuft, dann ist der Fehler bei gut 42 Jahren grob geschätzt 1 Jahr. Keine Ahnung ob der Zeitstempel ein Jahr falsch gehen darf. Man kann auch mit 8 Bit eine 64 Bit Division machen. Dazu dürfte es Codebeispiele im Netz geben. Funktioniert im Prinzip wie eine Rechnung auf Papier. Ist halt etwas aufwändiger.
Oliver schrieb: > Eben, der Wertebereich der ganzen Sekunden im 64-Bit Timestamp passt > nämlich nicht in 32-Bit Hmm, vom 1.1.1970 sind bis jetzt etwa 1,3x Milliaren Sekunden vergangen wenn ich mich nicht verrechnet habe. Sollte also noch passen. Kommt halt auch auf den Zeitstempel an.
der Timer läuft seit Epoch, das hatte ichv ergessen zu sagen... Aber habe ich eine Lösung gefunden, basieren auf nem look-up table. damit habe ich jetzt einen Fehler von ca. 2 sekunden, aber der reicht aus. Danke für eure Anregungen!
Stephan S. schrieb: > der Timer läuft seit Epoch ?? Stephan S. schrieb: > Aber habe ich eine Lösung gefunden, basieren auf nem look-up table. Dann lass die die du gefragt hast auch an deiner Lösung teilhaben.
UR-Schmitt schrieb: > Stephan S. schrieb: >> der Timer läuft seit Epoch ?? http://de.wikipedia.org/wiki/Epoch
Warum nicht einfach Division, wie man sie in Assembler macht: 64 mal links schieben, testen, abziehen und fertig. Die 64 Bit übergibt man als 2 * 32Bit:
1 | #define uint8_t unsigned char
|
2 | #define uint16_t unsigned short
|
3 | #define uint32_t unsigned long
|
4 | |
5 | uint32_t div64b_1000( uint32_t high32, uint32_t low32 ) |
6 | {
|
7 | uint16_t temp = 0; |
8 | uint8_t i; |
9 | |
10 | for( i = 64; i; i-- ){ |
11 | temp <<= 1; |
12 | if( high32 & 0x80000000 ) |
13 | temp |= 1; |
14 | high32 <<= 1; |
15 | if( low32 & 0x80000000 ) |
16 | high32 |= 1; |
17 | low32 <<= 1; |
18 | if( temp >= 1000 ){ |
19 | temp -= 1000; |
20 | low32 |= 1; |
21 | }
|
22 | }
|
23 | return low32; |
24 | }
|
Man kann da noch optimieren, z.B. die obersten 2 Byte gleich wegschmeißen. Peter
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.