Nous devons maximiser le xor entre «petit» et «haut». Prenons donc un exemple pour comprendre cela.
5 xor 2 = 101 xor 010 dans le premier cas: le bit MSB n'est pas défini pour les deux valeurs de la plage.Si vous voulez maximiser cela, ce que nous devons faire est de garder le MSB de 5 (100) tel qu'il est et de réfléchir à maximiser les bits inférieurs restants. Comme nous savons que les bits inférieurs seront tous un pour le cas où tout est 11, ce qui n'est que 3, c'est-à-dire 2 ^ 2-1. Puisque le problème parle de la plage entre 2 et 5, nous en avons certainement 3 dans la plage. Donc, tout ce que nous devons faire est de trouver l'ensemble MSB le plus élevé dans la plus grande des 2 valeurs et d'ajouter les 1 restants pour les bits inférieurs.
deuxième cas: Comme dans le cas où MSB est défini pour les deux valeurs de la plage, xor aura définitivement ces bits définis comme 0 et nous devons revenir aux bits inférieurs. Encore une fois pour les bits inférieurs, nous devons répéter la même logique que le premier cas. exemple: (10, 12) (1010, 1100) Comme vous pouvez le voir, les deux MSB sont définis sur 1, nous devons donc revenir aux bits inférieurs qui sont 010 et 100. Maintenant, ce problème est le même que dans le premier cas.
Il existe plusieurs façons de coder cela. Ce que j'ai fait, c'est de faire juste le xor entre «petit» et «haut» et cela supprimera le bit MSB si les bits «petit» et «haut» ont un bit MSB défini. Dans le cas contraire, il conservera le bit MSB. Après cela, j'essaie de faire tous les bits inférieurs 1 en trouvant la puissance maximale de 2 dans la sortie xorée et en soustrayant 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
couriri+1..r
eti
courirl...r-1
pour être précis.