Det finns bättre sätt att lagra datum, men om du verkligen vill göra så av någon anledning så gör man så här med / och %
Koden är iofs c, inte c++, men metodiken är den samma. (Fast main-funktionen och utskriften blir lite annorlunda)
#include <stdio.h>
int main(void){
int datum = 520091031;
int y,m,d;
y = (datum / 10000) % 10000;
m = (datum / 100) % 100;
d = (datum / 1) % 100;
printf("%d-%d-%d\n", y, m, d);
}
Nu har jag varit lite övertydlig för att demonstrera vad jag gör. / motsvarar förflyttning högerut. % motsvarar avklippning på vänstersidan. För dagarna så är inte divisionen nödvändig då datum / 1 ju är lika med datum. % 100 gör, enkelt uttryckt att 100 dras ifrån talet så många gånger det går. (CPU'n gör det givetvis mer effektivt, men det är ett enkelt sätt att beskriva förloppet) Kvar blir 31.
För månaden delas datumet först med 100, kvar blir 5200910. Sedan modulo som gör att 10 blir kvar.
För dagen delas datumet först med 10000 vilket alltså "förskjuter" talet fyra steg åt höger. Kvar blir 52009 nu undrar du säkert vad femman står för. Det är ett nummer jag har lagt till bara för att visa modulo-operatorns princip åter igen. % 10000 begränsar årtalet till intervallet 0-9999. Alltså, alla siffror till vänster om tusentalet i årtalet filtreras bort. Detta är så klart inte egentligen nödvändigt, precis som divisionen med 1 för dagen inte är nödvändigt.
Extrauppgift: Hur fungerar detta för andra nummer än jämna tiotal? Hur relaterar detta till andra talbaser än 10, t ex 16 (hexadecimala tal)?
#include <stdio.h>
int main(void){
long datum = 0x20091031;
long y,m,d;
y = (datum / 0x10000) % 0x10000;
m = (datum / 0x100) % 0x100;
d = (datum / 0x1) % 0x100;
printf("%X-%X-%X\n", y, m, d);
}
0x påbörjar ett hexadecimalt tal, %X skriver ut ett tal i hexadecimal notation.
0x20091031 = 537464881 decimalt och 0x10000 = 65536 decimalt. Ändå fungerar koden. Fundera på varför.
Lycka till. :)
