Wir müssen das xor zwischen "klein" und "hoch" maximieren. Nehmen wir also ein Beispiel, um dies zu verstehen.
5 xor 2 = 101 xor 010 erster Fall: MSB-Bit ist nicht für beide Werte im Bereich gesetzt. Wenn dies maximiert werden soll, müssen wir das MSB von 5 (100) so belassen, wie es ist, und darüber nachdenken Maximieren der verbleibenden unteren Bits. Wie wir wissen, sind niedrigere Bits alle eins für den Fall, dass alles 11 ist, was nichts anderes als 3 ist, dh 2 ^ 2-1. Da es sich bei dem Problem um einen Bereich zwischen 2 und 5 handelt, haben wir definitiv 3 im Bereich. Wir müssen also nur den höchsten MSB-Satz im größeren von 2 Werten herausfinden und die verbleibenden Einsen für die unteren Bits hinzufügen.
Zweiter Fall: Wie für den Fall, dass MSB für beide Werte in dem Bereich gesetzt ist, in dem xor ausgeführt wird, werden diese Bits auf jeden Fall auf 0 gesetzt, und wir müssen zu niedrigeren Bits zurückkehren. Auch für niedrigere Bits müssen wir die gleiche Logik wie im ersten Fall wiederholen. Beispiel: (10, 12) (1010, 1100) Wie Sie sehen können, haben beide MSB auf 1 gesetzt, dann müssen wir zu niedrigeren Bits zurückkehren, nämlich 010 und 100. Jetzt ist dieses Problem dasselbe wie im ersten Fall.
Es gibt verschiedene Möglichkeiten, dies zu codieren. Was ich getan habe, ist, nur das xor zwischen "klein" und "hoch" zu machen, und das wird das MSB-Bit entfernen, wenn sowohl "klein" als auch "hoch" das MSB-Bit gesetzt haben. Ist dies nicht der Fall, wird das MSB-Bit beibehalten. Danach versuche ich, alle niedrigeren Bits zu 1 zu machen, indem ich die maximale Potenz von 2 in der xored Ausgabe herausfinde und von 1 subtrahiere.
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
laufeni+1..r
undi
laufen lassenl...r-1
, um genau zu sein.