最大AND两个数字

时间:2015-03-01 13:42:37

标签: algorithm

给定两个数字A和B,可以是A和B之间任意两个数字x和y的AND运算可以形成的最大数量,这意味着A≤x< y≤B。

示例:A = 1且B = 3,则答案为2.

因为A和B都可以达到10 ^ 18

2 个答案:

答案 0 :(得分:3)

注意:这个答案假定A≥0,这是公平的,因为这个问题与特定语言或整数表示无关,这对于负整数的位操作有意义。

如果B是奇数,则最大x&amp; y是B-1,通过选择y = B和x = B-1获得。

如果B是偶数且A足够低以允许选择y = B-1且x = B-2,则对于x和y的选择,最大值是B-2。否则,只有一个选择,B&amp; (B-1),无论评价为何。

答案 1 :(得分:1)

要扩展Pascal Cuoq's excellent answer,如果我们允许A&lt; 0并假设two's complement算术(基本上所有现代计算机都使用有符号整数),然后我们再次有几种情况:

  • 如果A&lt; 0≤B,那么我们可以选择x = -1和y = B,在这种情况下x&amp; y = B。

  • 如果A&lt; B&lt; 0,那么一切都像正数一样工作:如果B是奇数,或者如果A = B-1,那么最优选择是x = B-1,y = B;否则它是x = B-2,y = B-1。

(之所以完全相同的原因是因为两个补码的带符号算术基本上与无符号二进制算术完全相同,除了我们解释其最高位设置为负数的数字。因此,唯一真正新的情况是一个其中A到B的范围“环绕”从-1到0。)


总结这些结果,我们得出,A≤x<1。 y≤B,任何给定的(可能是带符号的二进制补码)A和B,x&amp;的最大值。 y是:

  • 如果A&lt; 0≤B,则x = -1,y = B,得到x&amp; y = B。

  • 否则,如果B是奇数,则x = B-1且y = B,得到x&amp; y = B-1。

  • 否则,如果B> A + 1,则x = B-2,y = B-1,得到x&amp; y = B-2。

  • 如果以上都不成立,则唯一剩下的情况是B = A + 1(B均匀);在这种情况下,唯一可能的选择是x = A,y = B;无论x&amp; y在这种情况下等于,它通常是最大值。