Zikon (09.12.2015 20:31 - 20:36, просмотров: 209) ответил PeterD на Как можно посчитать быстро a = (b*c)/(2^64) где unsigned int a; unsigned long int b; const unsigned long int c; Если короче а 32 бита, и b и с 64 бита.
результат умножения b*c - 128 bit разобъем b и с на 32 битные слова (bh bl) (ch cl)
тогда
b*c = (bh*ch)<<64 + (bl*ch)<<32 + (bh*cl)<<32 + bl*cl
так как нам нужен 32 бит результат от сдвига на 64
от первого умножения берем младшие 32 бита
от второго и третьего - старшие 32 бита
а четвертое - совсем отбрасываем
и складываем только три 32 битных слова!
ВОТ от этого и отталкиваетесь!
да забыл про переносы
надо все-таки сложить второе и третье полностью
к сумме прибавить старшие 32 бита от четветрого
от результата взять старшие 32 бита
и прибавить их к младшим 32 битам первого