AcWing 5076. 位运算
原题链接
简单
C++ 代码
//法一
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
int x,i,j;
int res=0;
cin>>x>>i>>j;
vector<int> q(31);
//取出每一位二进制数存到vector中去 注:i,j可能大于x本身的二进制数位数,所以用for循环遍历i,j的最大可能位数31
for(int k=0;k<31;k++)
{
q[k]=x>>k&1; //获取x的第k位二进制数是什么
}
swap(q[i],q[j]); //交换i,j位
//再把交换好的二进制数逐位加回去得结果
for(int k=0;k<31;k++)
{
res+=q[k]<<k;
}
cout<<res<<endl;
return 0;
}
C++ 代码
//法二
#include<iostream>
using namespace std;
int main()
{
int x,i,j;
cin>>x>>i>>j;
//获取x的的第k位数:
int a=x>>i&1;
int b=x>>j&1;
//第i,j位二进制数一样,则交换与不交换结果相同
//第i,j位二进制数不同即一个1一个0,交换i,j位相当于第i,j位全部取自己的反就行了
if(a!=b)
{
//x的第k位取反:x^=1<<k (x的第k位异或1,^表示位运算的异或)
x^=1<<i;
x^=1<<j;
}
cout<<x<<endl;
return 0;
}