洛谷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;
}
posted @ 2025-04-10 12:53  2789617221guo  阅读(69)  评论(0)    收藏  举报