[an error occurred while processing this directive]
|
1. Эти операции сильно компилеро-зависимы (если, конечно же, думать об эффективности кода) => пиши на ассемблере.
2. Большинство их них очевидны: например ClearX(unsigned int* dst, int size) есть не что иное, как memset(dst, 0, size)
3. Операции умножения тоже просты - умножай в столбик или как полиномы.
4. Операция деления делается так:
/* returns a/b or a%b, see comments. */
__XX
__udivmodXI3 ( __XX a, __XX b)
{
__XX al = a; // quotant
__XX ah = 0; // reminder
__XX tmpf;
int i;
for (i = sizeof(__XX)*8; i > 0; i--)
{
ah = (ah << 1) | (al >> (sizeof(__XX)*8-1) );
tmpf = (ah >= b) ? 1 : 0;
ah -= ((tmpf) ? b : 0);
al = (al << 1) | tmpf;
}
return al; // for __udivXi3 = a/b
return ah; // for __umodXi3 = a%b
}
ну и
4. Все целочисленые операции выполняются с очень высокой точностью :)
5. GNUтый компилер имеет тип long long - 8байт
6. Если нужен больший размер чисел то либо что-то напутано с идеей, либо надо портировать libgmp, но у msp430xXXX может не хватить памяти.
E-mail: info@telesys.ru