P1100 高低位交换 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
大神的位运算解法:
#include<cstdio>
#include<iostream>
using namespace std;
int main()
{
unsigned long long x;
cin>>x;
//_____法一
// & 与运算可以取出后16位数字(&全为1才为1)(前16位清空)
//取出的后16位左移16位,即成为新数的前16位
//取出原数的前16位右移16位,变成新数的后16位
// | 按位或将两数合并到一起
cout<<((x&0x0000ffff)<<16|(x&0xffff0000)>>16)<<endl;
//_____法二
cout<<(n>>16)+(n<<16);
return 0;
}
bitset解法:
#include <iostream>
#include <algorithm>
#include <string>
#include <bitset>
#include <vector>
using namespace std;
int main(void){
unsigned long long n = 0;
cin >> n;
bitset<32> binary(n),rev(0);
for (int i = 0; i < 16; i++){
rev[16+i] = binary[i];
}
for (int i = 0; i < 16; i++){
rev[i] = binary[i + 16];
}
cout << rev.to_ullong() << endl;
return 0;
}
朴素:
#include<iostream>
#include<cstdio>
using namespace std;
long long x,ans,t=1;
int a[33],n;
int main()
{
scanf("%lld",&x);
while(x>0)
{
n++;
a[n]=x%2;
x/=2;
}
for(int i=1;i<=n;i++)
swap(a[i],a[n-i+1]);//读入+转二进制
for(int i=1;i<=16;i++)
swap(a[i],a[i+16]);//高低位交换
for(int i=1;i<=32;i++)
ans+=t*a[i],t*=2;
printf("%lld",ans);//再转回十进制输出。
return 0;
}