Я вот так это реализовывал:
Код
uint64_t bin2bcdU64(uint32_t n)
{
int i;
uint64_t ll;
uint64_t ull = 0ULL;
for(i=0;;i++)
{
ull = (ull<<1) | (n>>31);
n <<= 1;
if(i==31)
break;
ll = ( (ull>>3) | ((ull>>2) & ((ull>>1)|ull) ) ) & 0x1111111111ULL;
ull += ll | (ll<<1);
}
return ull;
}
т.е. Всё 32-х разрядное число в 64-х разрядное, в котором 10 значащих двоичнодесятичных разряда.
Если диапазон входных значений меньше то легко можно упростить/ускорить сократив разрядность переменных и укоротив цикл.
ЗЫ А всётаки кое чё на АСМах красивей!