64 bit Timestamp (in ms) in 32 Bit Timestamp (in sec) umwandeln, ohne 64 bit "Operation"

OP #2841308
Lesenswert?
• ▲
▼
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!
Gast #2841332
Lesenswert?
• ▲
▼
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.
Gast #2841336
Lesenswert?
• ▲
▼
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.
#2845220
Lesenswert?
• ▲
▼
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.