AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,a,b;
int main(){
cin>>n;
a=n%(1<<16);
b=n/(1<<16);
cout<<(a<<16)+b;
return 0;
}
这题说实话建议评红的
仔细审题,我们可以浓缩题意:
将这个数转换成二进制,不够32位补足32位,从中间劈开,交换两边二进制,得到新数。
再看数据范围,32位,由于交换后第三十二位有可能为1,这会造成int的正负号混乱。为了保险我们使用long long(其实也可以使用 unsigned int)。
思路:
1.输入n
2.定义a为n的右边16位(n%(1<<16))
3.定义b为n的左边16位(n/(1<<16))
4.输出a乘上2的16次方加b。
这里我们直接对题目提供的样例进行一下模拟,以帮助大家更好理解位运算。
1314520
=0000 0000 0001 0100 0000 1110 1101 1000(标黑部分是a)
=0000 0000 0001 0100 0000 1110 1101 1000(标黑部分是b)
如何取得a和b呢?
我们知道,1<<16是:
0000 0000 0000 0001 0000 0000 0000 0000(标黑部分是1<<16)
发现了吗?这就和我们求水仙花数时对十进制三位数进行分解时一样,1314520/(1<<16),会直接舍掉右16位,同理1314520%(1<<16),得到的就是直接舍掉左16位。
这样我们得到了a和b
输出时同理,我们把a的二进制直接左移16位,这样左边就空出来16位0,再加上b补在这个位置,正好就是我们所要的答案!
完结撒花~~