ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
23 ноября
637156 Топик полностью
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 битам первого