Precisamos maximizar o xor entre 'pequeno' e 'alto'. Então, vamos dar um exemplo para entender isso.
5 xor 2 = 101 xor 010 primeiro caso: o bit MSB não está definido para os dois valores no intervalo. Se você deseja maximizar isso, o que precisamos fazer é manter o MSB de 5 (100) como está e pensar sobre maximizando os bits inferiores restantes. Como sabemos, todos os bits inferiores serão um para o caso em que tudo é 11, que nada mais é do que 3, isto é, 2 ^ 2-1. Como o problema está falando sobre o intervalo entre 2 e 5, temos definitivamente 3 no intervalo. Então, tudo o que precisamos fazer é descobrir o maior MSB definido no maior dos 2 valores e adicionar os 1s restantes para os bits mais baixos.
segundo caso: como no caso em que MSB está definido para ambos os valores no intervalo xor, esses bits serão definidos como 0 e precisamos voltar aos bits mais baixos. Novamente, para bits mais baixos, precisamos repetir a mesma lógica do primeiro caso. exemplo: (10, 12) (1010, 1100) Como você pode ver que o MSB está definido como 1, temos que voltar aos bits inferiores, que são 010 e 100. Agora, esse problema é o mesmo do primeiro caso.
Existem várias maneiras de codificar isso. O que fiz foi fazer apenas o xor entre 'pequeno' e 'alto' e isso removerá o bit MSB se 'pequeno' e 'alto' tiverem o bit MSB definido. Caso esse não seja o caso, ele preservará o bit MSB. Depois disso, estou tentando fazer todos os bits 1 menores, descobrindo a potência máxima de 2 na saída xored e subtraindo de 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
passari+1..r
ei
passarl...r-1
para ser preciso.