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;
}