洛谷P1100 高低位交换 题解
本题做法
- 位运算。
思路
这题的数据范围使用 int 存储不下,得用 unsigned int。
读入后,我们就要开始考虑如何获取高低位的问题了。
我们都知道,C++ 中的右移运算是可以将一个正整数的二进制右移一位的,我们要忽略后 16 位,我们就可以通过 n>>16 获取高位。
那怎么获取低位呢?我们可以巧妙地运用 C++ 的整形溢出机制。
若一个数超过它的存储范围,如 \(2^{32}+114514\),超过了 unsigned int 的存储范围,那么程序会自动将这个值对 \(2^{32}\) 取模,也就是 114514。知道了这个特性,我们就可以运用左移运算来获取低位了。
直接将 n<<16,获取低位放到高位的值,再把 n>>16 加上去即可。
代码
#include<bits/stdc++.h>
using namespace std;
unsigned int n;
int main(){
cin>>n;
unsigned int front,back;
front=n>>16;
back=n<<16; //利用整形溢出,把高位去除
unsigned int ans=back+front;
cout<<ans<<endl;
return 0;
}

浙公网安备 33010602011771号