所有整数对a,b(l≤a≤b≤r)的xor b的最大值

时间:2016-02-24 20:01:59

标签: c++ algorithm xor

该问题要求为所有整数对找到xor b的最大值 成对的整数a,b(l≤a≤b≤r)。如果l和R是8和16,则答案是31,实际上是15 x或16.我遇到了这段代码,它给出了正确的输出但是逻辑部分不清楚。

int main() {
    cin >> A >> B;
    ll num = 1;
    while (A / num != B / num) {
        num *= 2;
    }
    cout << num - 1 << "\n";
    return 0;
}                                         

2 个答案:

答案 0 :(得分:1)

好吧,我可以轻松地破坏该代码。通过两次输入相同的数字。如果l = r则算法崩溃,但xor b的最大值显然是0,因为l = a = b = r。

假设l&lt; r,对于某些n,我们有(l /(2 ^ n))=(r /(2 ^ n))。有这样一个n因为我们可以选择n使2 ^ n&gt;河并且n> 0因为l&lt;河选择最小的这样的n。

在这种情况下,a /(2 ^ n)对于所有a具有相同的值,l≤a≤r。这意味着从位n开始的a ^ b中的所有位都为零。因此,xor b&lt; 2 ^ n,我们可以用l modulo(2 ^ n),r modulo(2 ^ n)替换l,r。

另一方面,选择n尽可能小。因此,在n中设置位n-1,而在l中清除位n-1。因此l < 2 ^(n-1),r≥2^(n-1)。我们可以选择a = 2 ^(n-1)-1,b = 2 ^(n-1)。然后l≤a≤b≤r,并且xor b = 2 ^ n - 1.由于我们证明xor b总是小于2 ^ n,但可以是2 ^ n - 1,因此它遵循2 ^ n - 1是最大值。

算法计算的正是什么,除了没有正确处理l = r。

答案 1 :(得分:0)

让我们以l = 8和r = 16或

为例
l = 00010
r = 00001

代码的作用是将位移位直到数字相同:

num=2  num=4  num=8  num=16   num=32

00100  01000  10000   00000  00000   
00010  00100  01000   10000  00000   -> done : max xor is 32-1

这是有效的,因为你可以获得的最大xor是尽可能多的位设置为1的数字,通常,如果你有

l = 0001010101010101011111111111110000001010101010...
r = 0010101010101010101101010101010100001010101010...
                                    ^...starting from here they are
                                        the same (no matter what) 

你可以从x和b得到的最大结果是l&lt; a&lt; b&lt; r是

    111111111111111111111111111111110000000000000000000...