高低位交换(洛谷)

题目

原题

题目描述

给出一个小于 2 32 2^{32} 232 的非负整数。这个数可以用一个 32 32 32 位的二进制数表示(不足 32 32 32 位用 0 0 0
补足)。我们称这个二进制数的前 16 16 16 位为“高位”,后 16 16 16
位为“低位”。将它的高低位交换,我们可以得到一个新的数。试问这个新的数是多少(用十进制表示)。

例如,数 1314520 1314520 1314520 用二进制表示为
0000   0000   0001   0100   0000   1110   1101   1000 0000\,0000\,0001\,0100\,0000\,1110\,1101\,1000 00000000000101000000111011011000(添加了 11 11 11 个前导 0 0 0 补足为
32 32 32 位),其中前 16 16 16 位为高位,即 0000   0000   0001   0100 0000\,0000\,0001\,0100 0000000000010100;后 16 16 16 位为低位,即
0000   1110   1101   1000 0000\,1110\,1101\,1000 0000111011011000。将它的高低位进行交换,我们得到了一个新的二进制数
0000   1110   1101   1000   0000   0000   0001   0100 0000\,1110\,1101\,1000\,0000\,0000\,0001\,0100 00001110110110000000000000010100。它即是十进制的 249036820 249036820 249036820

输入格式

一个小于 2 32 2^{32} 232 的非负整数

输出格式

将新的数输出

样例 #1

样例输入 #1

1314520

样例输出 #1

249036820

这题难度并不高,不过有些小的注意点因此把这个写下记录

思路

根据题目所述,将一个十进制的数转化为二进制,并更改二进制数的位置得到一个新的十进制数。由于位置变换简单,因此直接使用移位运算符即可,移位运算符号是直接对计算机存储的二进制进行移位操作,通常对一个数除以2时会直接使用>>1就达到除二并向下取整的效果。
这里的注意点是数据大小范围是32位,和int型相同,不过int型还有一bit是用来存储符号的,即使输入值小于int可存储范围,移位置后也可能出现一些问题。例如一个二进制数的第16位是1,移动后符号位就变成一个负数标识,最后读出的数就成了一个负数,并且由于负数的存储是采用补码形式最后结果会相差十万八千里。
正确的做法是采用long int型存储,或者直接使用unsigned int。这样可以保证数据可以存储并且结果也可以存储

代码

#include<iostream>
using namespace std;
int main(){
	unsigned int a;
	unsigned int temp1,temp2;
	cin>>a;
	temp1=a>>16;
	temp2=a<<16;
	cout<<temp1+temp2; 
} 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值