«Эффективные» может означать разные вещи здесь: например, асимптотические против производительности при известном диапазоне входы; время и пространство; и т. д.
Предполагаю, что вы заботитесь о необработанной скорости для небольших ограниченных входов, которые вы описываете.
Исходный подход. Возьмите меньший бит и сдвиньте его влево до тех пор, пока он не будет равен большему биту, сбрасывая сдвиги. Хотя это O (n), такой анализ здесь не имеет значения, поскольку n ограничено.
Вы можете сравнить эту базовую линию с одним из следующих подходов, которые имеют лучшую временную сложность, но могут или не могут быть быстрее для ваших входов.
Альтернатива 1. Поместите все расстояния в матрицу поиска. O (1), а O (n^2) - сложность пространства.
Вариант 2. Иметь таблицу поиска для логарифмов, и возвращает журнал разности (а) - журнал (б), где а> = Ь. O (1), сложность времени O (n). (Обратите внимание, что я предполагаю, что dist (a, a) = 0, который является побочным из того, что вы описали выше.)
Я не знаю на практике, какой из них будет быстрее, но главное - не предполагать, что O (n) означает, что алгоритм медленнее в абсолютных выражениях для ваших входов.
Незначительная точка: если вы хотите, чтобы dist (a, a) = 0 (типичный для функции расстояния), тогда было бы целесообразно увеличить ваши расстояния на один. –