2872: 小T的操作序列
【小染心得】:位运算的灵活应用
题目描述
小T在上网冲浪时发现了一组操作序列,潜意识告诉他根据上面的信息操作会有意向不到的事情发生。
操作规则是,对于一个数N,将其二进制下的某一位的1移动至另一个位置,如果原位置不为1则忽略,如果目标位置原先也为1,则进位。依次操作改变N的值。
输入
本题为多样例测试。
首行输入两个整数N、T,分别代表原始数字和样例数,0 < N < 1e9,T 不超过100000。
下面T行,每行输入两个整数x、y,代表将第x位向左移y位,0<x<31,-x<y<31 - x。
输出
对于每次操作,输出操作后的数,单独占一行,题目保证答案不会超出int范围。
样例输入 Copy
75 3
7 -4
4 -3
4 7
样例输出 Copy
15
8
1024
#include<bits/stdc++.h>
using namespace std;
int main()
{ long long x,n,f,j,k;
scanf("%lld%lld",&x,&n);
while(n--)
{
scanf("%lld%lld",&j,&k);
f=x&(1<<(j-1));
if(f!=0)
{ x=x-(1<<(j-1));//将原位置为0
j=j+k;
x=x+(1<<(j-1));//将目标位置变为1
}
printf("%lld\n",x);
}
}