51nod3047 位移运算

博客探讨了如何仅通过位移运算(右移 >> 和左移 <<)将一个数转换成另一个数。针对给定的输入样例和数据范围,解题思路包括考虑a为0和大于0的情况,并通过二进制匹配找到解决方案。最后提供了AC代码实现及其运行时间和空间效率。
摘要由CSDN通过智能技术生成


题目

给出两个数a,b。问a能否只通过位移运算( >>和 << 可以多次使用)变成b。如果可以输出"Yes",否则输出"No"。


输入

第一行:一个数 t ( 1≤t≤100000)。
第2 ~ t+1行:每行2个a,b中间用空格分隔(0≤a, b≤10^9)。

输出

输出共t行,对应答案的"Yes"和"No"

数据范围

对于20%的数据,1≤t≤50,0≤a, b≤20;
对于40%的数据,1≤t≤2000;
对于100%的数据,1≤t≤100000,0≤a, b≤10^9;

输入样例

4
4 2
2 4
3 4
1 3

输出样例

Yes
Yes
Yes
No


解题思路

当a=0时,b不管怎么位移都是0

任何大于0的a经过若干次右移终能变成0、1,而1经过n次左移只能变成2^n,
故a≥1时,b可以是a本身、…、0、1、2^n

那b为…(如3、5、6等)时呢?就需要对a进行特殊处理来得出b了:

例:
输入
2
13 5
11 20
输出
Yes
Yes

13即1101,5即101;
11即1011,20即10100;
规律:二进制b去掉末端连续0以后,总是二进制a的一部分
故我们把a和b都转换成二进制字符串,截取b串有效部分去匹配a串就可以了


AC代码

#include<bits/stdc++.h>
using namespace std;
string DecToBin(int n){
   
	string s
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值