两种操作:x =\left \lfloor \frac{x}{2} \right \rfloor以及选择一个整数z,令x = x | z,求最小的操作次数让x = y
从二进制上考虑,那么第一个操作就是x的二进制整体向右移动一位,第二个操作就是增加到某一个数。
如果x的二进制某一位置为1,而y二进制对应的位置为0,那么x只能通过进行操作一将该位置的1抹除掉,所以首先就得进行操作一使得不存在同一二进制位置上x为1,y为0的情况,但可以存在(0,0),(1,1),(0,1)的情况,(0,0),(1,1)不用多说,如果是(0,1),那么就可以进行操作二将(0,1)变为(1,1)
所以如何判断不存在(1,0)这个情况了呢?如果(x | y)= y时,就说明没有(1,0)了
求最小操作次数,那么我们先将x不断进行操作一,最坏情况变为0,所以操作一次数不会超过64次。
然后就只剩下(0,0),(1,1),(0,1)。如果此时恰好不存在(0,1),那么x就刚好等于y了,不需要进行操作二;否则只需要进行一次操作二,将所有的(0,1)变为(1,1)即可
#include<bits/stdc++.h>
using namespace std;

#define endl '\n'
#define int long long
#define IOS ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define HelloWorld IOS;


void solve(){
    int x, y; cin >> x >> y;
    int ans = 0;
    for(int i = 0; i < 64; i ++){
        if(((x >> i) | y) == y){
            ans += i;
            break;
        }
    }
    x >>= ans;
    if(x == y) cout << ans << endl;
    else cout << ans + 1 << endl;
    return ;
}
signed main(){
    HelloWorld;
    
    int tt; cin >> tt;
    while(tt --) solve();
    return 0;
}