Нам нужно максимизировать xor между «маленьким» и «высоким». Итак, давайте рассмотрим пример, чтобы понять это.
5 xor 2 = 101 xor 010 первый случай: бит MSB не установлен для обоих значений в диапазоне. Если мы хотим максимизировать это, то нам нужно сохранить MSB равным 5 (100) и подумать о максимизация оставшихся младших битов. Поскольку мы знаем, что младшие биты все будут едины для случая, когда все равно 11, что является ничем иным, как 3, т.е. 2 ^ 2-1. Поскольку проблема говорит о диапазоне от 2 до 5, мы определенно имеем 3 в диапазоне. Таким образом, все, что нам нужно сделать, это найти самый высокий набор старших битов из двух больших значений и добавить оставшиеся 1 для младших битов.
Второй случай: Что касается случая, когда MSB установлен для обоих значений в диапазоне, при выполнении xor эти биты определенно будут установлены в 0, и нам нужно вернуться к младшим битам. Опять же для младших битов нам нужно повторить ту же логику, что и в первом случае. пример: (10, 12) (1010, 1100) Как вы можете видеть, что оба MSB установлены в 1, тогда мы должны вернуться к младшим битам, которые равны 010 и 100. Теперь эта проблема такая же, как в первом случае.
Есть несколько способов закодировать это. Я просто сделал xor между «small» и «high», и это удалит бит MSB, если для «small» и «high» установлен бит MSB. Если это не так, тогда он сохранит бит MSB. После этого я пытаюсь сделать все младшие биты 1, определив максимальную мощность 2 в xored выходе и вычитая из 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
чтобы быть точным.