AND 操作的最大值

Maximum value of AND operation

本文关键字:最大值 操作 AND      更新时间:2023-10-16

给定两个数字 A 和 B.求对 (P,Q) 的值,使得 A <= P <= 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;
}

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

当 b

不是 2 的幂时,你认为答案是 b&(b-1),这是错误的。假设 b 是(a 非常小的假设)1001000,b-11000111 和他们的 and 是 1000000但真正的答案是10001111000110之间的1000110
因此,如果它是 2 的幂,您的解决方案是正确的。
如果它不是 2 的幂,那么答案应该是 (b-1)&(b-2),如果 b 不是奇数,否则 b&(b-1)。(除了只有两个数字的极端情况,即如果 a=b-1

这段代码是用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)