加密2-华东师范-2020

加密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);

    }

    return 0;               

}

原文地址:https://www.cnblogs.com/zhouhongweihpu/p/3230073.html