异或运算的一些应用

定义

  异或是一个数学运算,用于逻辑运算。如果a、b两个值不同,则异或结果为1,否则结果为0,在C语言中是一种强大的基本运算符,有很多巧妙的应用。

  例如, A = 14, B = 10;

  A = 14,二进制则为1110,B = 10,二进制为1010.

  对二进制数进行异或运算 -> 1110^1010 = 0100,对应十进制就为4。

  在二进制数异或过程中,我们可以得知异或运算是一种半加运算。什么意思呢?半加即不带进位的加法运算。

  如上面1110^1010 = 0100,如果在加法中,如下

   

   我们从低位开始加起,首先第0位为0+0=0;第一位1+1=0,如果是加号运算符,则需要进位,但由于是异或运算(半加),故不用进位,第二位为1+0=1;最后一位为1+1=0。最终结果就是0100,这就是半加的过程。

特性

  1.一个数与0进行异或运算,其运算结果是自身;

  2.一个数与自身进行异或运算,其运算结果为0;

  3.异或运算满足分配律,即 3^4^3与3^3^4的结果一样,都为4。

异或运算的一些应用

1.异或最常用的一种用法 -- 交换两个数的值。

  这里直接上代码。

 1 /*************************************************************************
 2     > File Name: swap.c
 3     > Author: yudongqun
 4     > Mail: qq2841015@163.com
 5     > Created Time: Fri 16 Oct 2020 04:48:54 PM CST
 6  ************************************************************************/
 7 
 8 #include <stdio.h>
 9 
10 int main(void) {
11     int a = 10, b = 20, tmp;
12 
13 #if 0
14     /*用中间值来实现值交换*/
15     tmp = a;
16     a = b;
17     b = tmp;
18 #else
19     /*用异或操作来实现值交换*/
20     a ^= b;
21     b ^= a;
22     a ^= b;
23 #endif
24     printf("a: %d, b: %d\n", a, b);
25 
26     return 0;
27 }
ydqun@VM-0-9-ubuntu operator % gcc swap.c                                                                  [0]
ydqun@VM-0-9-ubuntu operator % ./a.out                                                                     [0]
a: 20, b: 10
ydqun@VM-0-9-ubuntu operator % 

  这里异或操作实现的值交换的好处是少使用了一个临时变量,执行效率也比较高。

2,寻找只出现一次的数字。

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:

输入: [2,2,1]
输出: 1

示例 2:

输入: [4,1,2,1,2]
输出: 4
 1 /*************************************************************************
 2     > File Name: single_number.c
 3     > Author: yudongqun
 4     > Mail: qq2841015@163.com
 5     > Created Time: Fri 16 Oct 2020 05:20:25 PM CST
 6  ************************************************************************/
 7 
 8 #include <stdio.h>
 9 
10 int single_number(int nums[], int n) {
11     int res = 0;
12     for (int index = 0; index < n; index++) {
13         res ^= nums[index];
14     }
15     return res;
16 }
17 
18 int main(void) {
19     int nums[5] = {1, 2, 2, 1, 6};
20     printf("single number is : %d\n", single_number(nums, 5));
21 }
ydqun@VM-0-9-ubuntu operator % g++ single_number.c                                                         [0]
ydqun@VM-0-9-ubuntu operator % ./a.out                                                                     [0]
single number is : 6
ydqun@VM-0-9-ubuntu operator %  

  这里是运用了异或的特性2与特性3,1^2^2^1^6 = 1^1^2^2^6 = 0^0^6 = 6。

    

 

posted @ 2020-10-16 17:34  ydqun  阅读(763)  评论(0编辑  收藏  举报