GeSHi (C):
char EGN[10];
char dec[5];
unsigned int FINAL_EGN;
void dec2bin(char *str, char *dec, int len)
{
int cnt, cnt1;
unsigned char val=0;
unsigned char tmp1=0,tmp2=0;
char *charset="0123456789";
for (cnt=0;cnt<(len/2);cnt++)
{
val = 0;
for (cnt1=0;cnt1<10;cnt1++) if (charset[cnt1] == dec[cnt*2]) tmp1 = cnt1;
for (cnt1=0;cnt1<10;cnt1++) if (charset[cnt1] == dec[cnt*2+1]) tmp2 = cnt1;
val |= (tmp1 << 4);
val |= tmp2;
*(str+cnt) = val & 255;
}
}
dec2bin(dec,EGN,10);
FINAL_EGN = ((dec[0]&127)<<25)|((dec[1]&31)<<20)|((dec[2]&31)<<15))|((dec[3]&127)<<8)|((dec[4]&127)<<1))
Нещо такова ми се върти из главата...ЕГН-то е реално 5 байта ако го превърнем в "binary вид", първият байт не може да е повече от 127 (година), следователно пестим един бит, вторият байт не може да е повече от 31 (ден), следователно пестим 3 бита, третият също не може да е по-голям от 31(месец), пестим 3 бита, четвъртият не може да е по-голям от 128, пестим един бит, последният не може да е по-голям от 128, пестим 1 бит.
9 бита могат да се спестят, така че можем да се вместим в 32-битова променлива
Всъщност 10 бита могат да се спестят, месеца е по-малък от 16.
П.П превръщането в "binary" вид е за удобство, можем и директно да подходим към проблема