AND操作的最大值

时间:2015-01-03 19:55:50

标签: c++ algorithm

给出两个数字A和B.找到对(P,Q)的值,使得A <= P <1。 Q&lt; = B的值,P AND Q最大,其中AND是二元运算符。有关AND运算符

的更多信息,请参阅此链接
1<= A < B <=10^18

代码:

int main()
{
    int t;
    cin>>t;
    while(t--){
        long long int nearpow =0;
        int count=1;
        int a ; int b;
        cin>>a>>b;

        while(nearpow<=b){

            nearpow = 1<<count;
            count++;

        }
        nearpow/=2;

        if(nearpow==b){
            long long int x = b-1;
            long long int y = b-2;
            if(y>=a) cout<<(x&y)<<endl;
            else cout<<(b&x)<<endl;
        }else{
            long long int max=0;
            cout<<(b&(b-1))<<endl;

        }

    }
    return 0;
}

我从这种方法得到了错误的答案。哪里我错了?请帮忙

2 个答案:

答案 0 :(得分:0)

b 不是2的幂时,你会回答 b&amp;(b-1)这是错误的。假设 b 是( a 非常小的假设) 1001000 b-1 1000111 和他们的 1000000 。但真正的答案是 1000111 1000110 之间, 1000110
因此,如果它的功率为2,则您的解决方案是正确的。
如果它不是2的幂,则答案应该是(b-1)&amp;(b-2)如果 b 不是奇数,否则 b&amp;(b -1)即可。 (除了只有两个数字的角落情况,即如果 a = b-1

答案 1 :(得分:0)

此代码在python中,但您可以检查此问题的工作原理

T=int(input())
    for i in range(T):
        A,B=list(map(int,input().split()))
        if(B%2==0):
            ans=B-2;
        else:
            ans=B-1;
        if(ans>=A):
            print(ans)
        else:
            print(A&B)