70,017
社区成员




我的程序如下:
#include <bits/stdc++.h>
using namespace std;
#define ull unsigned long long
#define ll long long
int main()
{
int n = 0;
cin >> n;
while (n--)
{
ull a = 0, b = 0;
bool flg = 0;
cin >> a >> b;
if (b==0)
{
cout << "Yes\n";
continue;
}
while (!(b & 1) && b) b >>= 1;
while (a>=b)
{
ll t = a ^ b;
if (((a & b) == b) && ((t & -t) > b || !t))
{
flg = 1;
break;
}
a >>= 1;
}; cout << (flg ? "Yes" : "No") << endl;
}
}
叉叉学习了两种位运算:<<
和 >>
。为了避免 undefined behavior(未定义行为),叉叉只讨论非负整数下的情况。当 <<
时,最高位会溢出,最低位会补 0
;当 >>
时,最低位会溢出,最高位会补 0
。
小粉兔决定考考叉叉,于是想了两个非负整数 a,b。小粉兔希望叉叉判断,a 能否利用若干次 << 1
和 >> 1
运算变成 b。
输入格式
本题有多组数据。
第一行一个正整数 T,表示数据组数。
对于每组数据:一行两个非负整数 a,b。
对于每组数据:
若 a 能利用若干次 << 1
和 >> 1
运算变成 b,则一行一个字符串 Yes
,否则一行一个字符串 No
。
输入 #1
6 1 0 0 1 3 7 7 3 4 6 153 6
输出 #1
Yes No No Yes No Yes
#include <stdio.h>
int main()
{
unsigned int a, b, i, m, t, x;
const unsigned int msb = sizeof(msb) * 8 - 1;
for (scanf("%u", &t); scanf("%u%u", &a, &b), t; t--)
{
if (a == b || (a && !b)) x = 1; else if (!a && b) x = 0; else
{
for (i = 0; !((b << i) & (1 << msb)); i++);
for (m = 0; !((b >> m) & 1); m++);
m = (unsigned int)-1 >> i & -1 << m;
for (x = i = 0; i <= msb; i++) if ((x = (a << i & m & b) == b)) break;
for (i = 0; !x && i <= msb; i++) if ((x = (a >> i & m & b) == b)) break;
}
x ? puts("Yes") : puts("No");
}
return 0;
}