Да. Это потребует сдвигов, и я не рекомендую делать это в C. Это один из тех редких примеров, когда ассемблер все еще может доказать свою ценность, легко заставляя вещи работать в сотни раз быстрее (и я не думаю, что преувеличиваю это.)
Я не претендую на полную корректность, но следующее должно помочь вам:
(1) Инициализировать результат в ноль.
(2) Сдвиньте делитель на максимально возможное число битов влево, не позволяя ему стать больше делимого.
(3) Вычтите сдвинутый делитель из дивиденда и прибавьте один к результату.
(4) Теперь сдвигайте делитель вправо до тех пор, пока он снова не станет меньше, чем оставшийся дивиденд, и для каждого результата сдвига вправо, сдвига влево на один бит. Вернитесь к (3), если условие остановки не выполнено. (Условие остановки должно быть чем-то вроде «делитель стал равным нулю», но я не уверен в этом.)
Действительно приятно вернуться к некоторым РЕАЛЬНЫМ проблемам программирования: -)