Цитата(ukpyr @ Apr 26 2011, 18:28)

желательно протестировать весь диапазон long int, мало ли что...
протестировал - ваш алгоритм дает кучу ошибок, начиная с 131080 (вместо 13108 получается 13107).
там после умножения на 0x3333 обязательно нужна коррекция - прибавить 0x3333
коррекция на 0x3333 уже есть в коде
но ошибки действительно есть т.к. после добавления остатка от деления старшей части
у нас диапазон становится 0 - 0x50000
сейчас будем допиливать...
Вроде так корректно:
Код
DWORD N = ...; // делимое
DWORD result;
N >>= 1;
result = (((N >> 16) + 1) * 0x3333) & 0xFFFF0000;
N = N - result * 5 + 1;
N += N >> 16; // коррекция для диапазона 0x10000 - 0x50000
result |= (N * 0x3333) >> 16;