Musimy zmaksymalizować xor między „małym” a „wysokim”. Weźmy więc przykład, aby to zrozumieć.
5 xor 2 = 101 xor 010 pierwszy przypadek: bit MSB nie jest ustawiony dla obu wartości w zakresie.Jeśli chcesz to zmaksymalizować, musimy zachować MSB na poziomie 5 (100) i zastanowić się nad maksymalizacja pozostałych niższych bitów. Jak wiemy, niższe bity wszystkie będą jednym dla przypadku, gdy wszystko ma wartość 11, co jest niczym innym jak 3, tj. 2 ^ 2-1. Ponieważ problem dotyczy zakresu od 2 do 5, z pewnością mamy 3 w zakresie. Więc wszystko, co musimy zrobić, to znaleźć najwyższy zestaw MSB w większej z 2 wartości i dodać pozostałe 1 dla niższych bitów.
Drugi przypadek: tak jak w przypadku, gdy MSB jest ustawione dla obu wartości w zakresie wykonującym xor, z pewnością mają te bity ustawione na 0 i musimy wrócić do niższych bitów. Ponownie dla mniejszych bitów musimy powtórzyć tę samą logikę jak w pierwszym przypadku. przykład: (10, 12) (1010, 1100) Jak widać, oba mają ustawiony MSB na 1, więc musimy wrócić do niższych bitów, czyli 010 i 100. Teraz ten problem jest taki sam jak w pierwszym przypadku.
Istnieje kilka sposobów na zakodowanie tego. Zrobiłem tylko xor między „małym” a „wysokim”, a to usunie bit MSB, jeśli zarówno „mały”, jak i „wysoki” mają ustawiony bit MSB. Jeśli nie jest to przypadek, zachowa bit MSB. Następnie staram się uzyskać wszystkie niższe bity 1, znajdując maksymalną moc 2 na wyjściu xored i odejmując od 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
biegaći+1..r
ii
biegać,l...r-1
by być precyzyjnym.