「小さい」と「高い」の間のxorを最大化する必要があります。それでは、例を理解してみましょう。
5 xor 2 = 101 xor 010最初の場合:範囲内の両方の値にMSBビットが設定されていません。これを最大化する場合は、MSBを5(100)のままにして、残りの下位ビットを最大化します。私たちが知っているように、下位ビットはすべて、すべてが3以外の11、つまり2 ^ 2-1の場合に1になります。問題は2〜5の範囲に関するものであるため、最終的には3の範囲になります。したがって、必要なのは、2つの値のうち大きい方で最も高いMSBセットを見つけ、残りの1を下位ビットに追加することです。
2番目のケース:MSBがxorを実行する範囲内の両方の値に設定されている場合、これらのビットは確実に0に設定されるため、下位ビットに戻る必要があります。下位ビットについても、最初のケースと同じロジックを繰り返す必要があります。例:(10、12)(1010、1100)両方ともMSBが1に設定されていることがわかるように、下位のビット010と100に戻らなければなりません。この問題は最初のケースと同じです。
これをコーディングする方法はいくつかあります。私がしたことは、 'small'と 'high'のxorだけを行うことで、 'small'と 'high'の両方にMSBビットが設定されている場合、MSBビットが削除されます。そうでない場合は、MSBビットが保持されます。その後、xored出力で2の最大電力を見つけ、1から減算することにより、下位ビットをすべて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
正確に。