不使用中间变量交换两变量a、b的值 (Java)

不使用中间变量交换两变量(异或运算)

  • 一、异或XOR
  • 二、使用异或运算(^)交换变量

一、异或XOR

异或运算符(^)是指: 参与运算的两个值,如果两个相应位相同,则结果为0,否则为1。即:0^0=0, 1^0=1, 0^1=1, 1^1=0 (任何数与0异或等于其自身)

例如:(1011)2 ^ (1001)2 = (0010)2

异或运算也是一种简单的加密算法。

例如:
原文:100101
密钥:101110
对原文加密即用 原文与密钥异或运算可得到密文
原文^密钥=密文:001011
对密文解密即用 密文与密钥异或运算可得到原文
密文^密钥=原文:100101

代码演示:

		//原文
		int text = 37;//二进制为100101
		String str_text = Integer.toBinaryString(text);
		//密钥
		int key = 46;//二进制为101110
		String str_key = Integer.toBinaryString(key);
		//密文
		int ciphertext;
		ciphertext = text ^ key;
		String str_cip = Integer.toBinaryString(ciphertext);
		System.out.println("2进制输出各数:");
		System.out.println("原文:"+str_text);
		System.out.println("密钥:"+str_key);
		System.out.println("密文:"+"00"+str_cip);
		//用密文异或密钥得原文
		ciphertext = ciphertext ^ key;
		str_cip = Integer.toBinaryString(ciphertext);
		System.out.println("还原:"+str_cip);

执行效果:

2进制输出各数:
原文:100101
密钥:101110
密文:001011
还原:100101

二、使用异或运算(^)交换变量

如果给定整数a和b,用以下三行代码即可交换a和b的值。

a = a ^ b;
b = a ^ b;
a = a ^ b;

对于三行代码的理解:

  • 假设a异或b的结果记为c,c就是a整数位信息和b整数位信息的所有不同信息。
    比如,a=4=100,b=3=011,a^b=c=111。
  • a异或c的结果就是b。比如a=4=100,c=111,a^c=011=3=b。
  • b异或c的结果就是a。比如b=3=011,c=111,b^c=100=4=a。

所以,在执行完上面三行代码之前,假设有a信息和b信息。执行完第一行代码之后,a变成了c,b还是b;执行完第二行后,a仍然是c,b变成了a;执行完第三行代码之后,a变成了b,b仍然是a。过程结束。

你可能感兴趣的:(java,算法)