Неизвестно какие возможности вашего языка программирования.
Можно поизвращаться и переписать код на C без использования сдвига:
void AddModulo512(const unsigned char *a,const unsigned char *b,unsigned char *c)
{
int i = 0, t = 0;
unsigned char * pResult = (unsigned char *)(&t);
unsigned char * pNext = pResult + 1;
for(i=63;i>=0;i--)
{
t = a[i] + b[i] + *pNext;
c[i] = *pResult;
}
}
Смысл в том, что вы смотрите на число, как на массив из 4 байт. В старшем будет результат сложения двух байт, а во втором байте результат переполнения, который перейдёт на следующий байт результата.
Есть подозрение, что работа с указателями будет работать медленнее, чем работа с числами. Хотя всё зависит от компилятора.