题目描述
给出一个小于 2^32的非负整数。这个数可以用一个 32位的二进制数表示(不足 32 位用 0$补足)。我们称这个二进制数的前 16 位为“高位”,后 16 位为“低位”。将它的高低位交换,我们可以得到一个新的数。试问这个新的数是多少(用十进制表示)。
例如,数 1314520 用二进制表示为 0000|0000|0001|0100|0000|1110|1101|1000(添加了 11 个前导 0 补足为 32 位),其中前 16 位为高位,即 0000\0000\0001\0100;后 16 位为低位,即 0000\1110\1101\1000。将它的高低位进行交换,我们得到了一个新的二进制数 0000\1110\1101\1000\0000\0000\0001\0100。它即是十进制的 249036820。
输入格式
一个小于 2^32的非负整数
输出格式
将新的数输出
样例
样例输入 1
1314520
样例输出 1
249036820
位运算符用于对二进制数进行操作。以下是C++中常用的位运算符的总结:
-
按位与(AND):
&
- 规则:当两个相应的二进位都为1时,结果位为1,否则为0。
- 例子:
5 & 3
的结果是1
,因为101 & 011
等于001
。
-
按位或(OR):
|
- 规则:当两个相应的二进位至少有一个为1时,结果位为1,否则为0。
- 例子:
5 | 3
的结果是7
,因为101 | 011
等于111
。
-
按位异或(XOR):
^
- 规则:当两个相应的二进位不相同时,结果位为1,否则为0。
- 例子:
5 ^ 3
的结果是6
,因为101 ^ 011
等于110
。
-
按位取反(NOT):
~
- 规则:将操作数的每个二进位取反。
- 例子:
~5
的结果是-6
,因为~101
等于-110
(在补码表示中)。
-
左移(Left Shift):
<<
- 规则:将操作数的二进位向左移动指定的位数,右边空出的位用0填充。
- 例子:
5 << 2
的结果是20
,因为101 << 2
等于10100
。
-
右移(Right Shift):
>>
- 规则:将操作数的二进位向右移动指定的位数,左边空出的位根据原操作数的符号位填充(正数填充0,负数填充1)。
- 例子:
5 >> 2
的结果是1
,因为101 >> 2
等于1
。
-
无符号右移(Unsigned Right Shift):
>>>
- 规则:将操作数的二进位向右移动指定的位数,左边空出的位总是用0填充。
- 例子:
5 >>> 2
的结果是1
,与5 >> 2
相同。
位运算符通常用于底层编程、优化代码、加密算法、图形处理等领域,因为它们比标准的算术运算更快,并且可以直接操作内存中的原始数据。
#include <iostream> // 引入输入输出流库
using namespace std; // 使用标准命名空间
int main() { // 主函数
unsigned int num; // 定义一个无符号整数变量num
cin >> num; // 从输入流中读取一个整数并存储到num中
unsigned int high = (num >> 16) & 0xFFFF; // 将num右移16位,并与0xFFFF进行按位与操作,获取高位
unsigned int low = num & 0xFFFF; // 将num与0xFFFF进行按位与操作,获取低位
unsigned int new_num = (low << 16) | high; // 将低位左移16位,然后与高位进行按位或操作,交换高低位
cout << new_num << endl; // 输出交换后的整数
return 0; // 返回0,表示程序正常结束
}