Мне задали этот вопрос в интервью, чтобы описать вывод в комментариях.Отдел на 3 без оператора деления
unsigned int d2(unsigned int a)
{
__int64 q = (__int64)a * 0x0AAAAAAAB; // (2^33+1)/3
return (unsigned int)(q >> 33);
}
Я проверил другие вопросы в Stackoverflow, связанные с делением на 3, но никто не кажется таким быстрым и маленьким. Может ли кто-нибудь помочь мне объяснить, как функция дает результат, написанный в комментариях?
Должно быть, что-то связано с переполнением. –
Это двоичный эквивалент взятия числа, умножающий его на 100000/3, что составляет около 33333, а затем деление на 100000, оставив его приблизительно равным исходному числу, деленное на 3. – Max
Нечетный вопрос для интервью :) –