加密2 |
Time Limit:1000MS Memory Limit:30000KB
Total Submit:145 Accepted:83
Description
对一个整数(32位无符号整数)进行规则如下的加密:
1. 低16位和高16位互换
2. 此时的低16位按位取反
3. 此时的高16位与低16位进行异或运算,结果存储到高16位
现在根据加密后的整数,求出加密前的整数的16进制形式.
Input
输入有多case,每个case一行,且只有一个整数
Output
对于每个case输出一个整数(16进制形式),即加密前的整数。
Sample Input
4294901759
Sample Output
1
hint:十六进制输出时请使用大写字母(A,B...)
解题思路:
1、 必须知道按位异或的特点:异或运算的特点如果 a^b=c,那么就有 c^b = a以及c^a=b此规律可以用来进行最简单的加密和解密.
2、 倒着求解即可。
程序代码:
#include<stdio.h>
int main()
{
unsigned int n,a,b,i,j,k;
while(scanf("%d",&n)!=EOF)
{
a=n>>16; //交换后的异或高16位
b=n<<16; // 需要注意的是 每次参与运算的只有16位,所以取完数,在移回来。
b=b>>16; //交换后的低16位
k=a^b; // 交换后的高16位
b=~b; // 交换后,按位取反前的 低16位
b=b<<16; // 低 16 位变成高16位
n=b+k; // 相加即可
printf("%X\n",n);
}
return 0;
}