Нам потрібно домогтися максимального значення між "малим" та "високим". Тож візьмемо приклад, щоб зрозуміти це.
5 xor 2 = 101 xor 010 перший випадок: біт MSB не встановлений для обох значень у діапазоні. Якщо ми хочемо максимально використовувати це, то нам потрібно зробити це зберегти MSB 5 (100) таким, яким він є, і подумати про максимізація решти нижніх бітів. Як ми знаємо, що нижчі біти всі будуть одним для випадку, коли все 11, це не що інше, як 3, тобто 2 ^ 2-1. Оскільки проблема стосується діапазону від 2 до 5, ми точно маємо 3 у діапазоні. Отже, все, що нам потрібно зробити, - це знайти найвищий набір MSB у більшій із двох значень та додати решту 1 для нижчих бітів.
другий випадок: Що стосується випадку, коли MSB встановлено для обох значень у діапазоні, що виконує xor, безумовно, ці біти встановлені як 0, і нам потрібно повернутися до нижчих бітів. Знову для нижчих бітів нам потрібно повторити ту саму логіку, що і в першому випадку. Приклад: (10, 12) (1010, 1100) Як ви бачите, MSB встановлений як 1, ми повинні повернутися до нижчих бітів, що становить 010 і 100. Тепер ця проблема така ж, як і в першому випадку.
Існує кілька способів цього кодувати. Що я зробив, це зробити просто xor між 'small' і 'high', і це видалить біт MSB, якщо для 'small' і 'high' встановлено біт MSB. Якщо це не так, то це збереже біт MSB. Після цього я намагаюся зробити всі нижчі біти 1, дізнавшись максимальну потужність 2 у виведеному виведенні та віднімаючи з 1.
def range_xor_max(small, high):
if small == high:
return 0
xor = small ^ high
#how many power of 2 is present
how_many_power_of_2 = math.log(xor, 2)
#we need to make all one's below the highest set bit
return 2**int(math.floor(how_many_power_of_2)+1) - 1
j
пробігатисяi+1..r
іi
пробігати,l...r-1
щоб бути точним.