Ну, я могу легко свернуть этот код. Введя один и тот же номер дважды. Если l = r, то алгоритм сработает, но наибольшее значение для xor b, очевидно, 0, так как l = a = b = r.
Предположим l < r и что для некоторого n имеем (l/(2^n)) = (r/(2^n)). Существует такое n, потому что мы можем просто выбрать n, делая 2^n> r. И n> 0, потому что l < r. Выберите наименьший такой n.
В этом случае a/(2^n) имеет то же значение для всех a, l ≤ a ≤ r. Это означает, что все биты в a^b, начинающиеся с бит n, равны нулю. Поэтому a xor b < 2^n, и мы можем заменить l, r на l по модулю (2^n), r по модулю (2^n).
С другой стороны, n было выбрано как можно меньше. Поэтому бит n-1 устанавливается в r, а бит n-1 очищается в l. Поэтому l < 2^(n-1), r ≥ 2^(n-1). Мы можем выбрать a = 2^(n-1) - 1, b = 2^(n-1). Тогда l ≤ a ≤ b ≤ r и a xor b = 2^n - 1. Так как мы показали, что xor b всегда меньше 2^n, но может быть 2^n - 1, то 2^n - 1 - наибольшее значение.
Именно то, что алгоритм вычисляет, за исключением того, что l = r обрабатывается неправильно.
может у объяснить это более ясно на примере, взяв две цифры говорят 8 и 16 –