异或运算 ^ 变量交换及找出现一次的数
2013-05-14 15:08
225 查看
一、交换2个变量
如果想要交换2个变量,一般的做法是引入第三个变量,
例如,
[cpp] view
plaincopy
temp = a;
a = b;
b= temp;
这样2个变量中的值就实现了交换。那能不能不引入其他变量就可以实现变量值的交换呢?答案是肯定的。
用异或操作可以实现,有2种实现方法,本质上是一样的。
法1:
[cpp] view
plaincopy
#include <stdio.h>
int main()
{
int a,b;
while(1)
{
scanf("%d %d",&a,&b);
a = a^b; //(1)
b = a^b; //(2)
a = a^b; //(3)
printf("%d %d\n",a,b);
}
return 0;
}
法2:
[cpp] view
plaincopy
#include <stdio.h>
int main()
{
int a,b;
while(1)
{
scanf("%d %d",&a,&b);
b = a^b; //(1)
a = a^b; //(2)
b = a^b; //(3)
printf("%d %d\n",a,b);
}
return 0;
}
因为2种方法本质一样,就方法一进行一下证明。
异或操作满足结合律和交换律,且由异或操作的性质知道,对于任意一个整数a^a=0;
证:(第(2)步中的a) a = a^b = (将第(1)步中的b代入b) a^(a^b) = b;
(第(3)步中的b)b = a^b = (将第(1)步中的b代入b,将第(2)步中的a代入a) a^b^a^a^b = a^a^a^b^b = a;
证毕
http://blog.csdn.net/love_cppandc/article/details/7023238
二、求出现一次的数
题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字
这道题利用异或的几个性质:任何数与其本身异或值都为0,异或运算满足交换律。因此将一组数依次异或,若里面只有一个只出现一次的数,其他的数都出现两次,则最后的结果必然是那个只出现一次的数。要找到两个数字就可以先通过异或整个数组,将得到的结果分组。然后依次安组异或就可以得到所求的值~
代码如下:
?
如果想要交换2个变量,一般的做法是引入第三个变量,
例如,
[cpp] view
plaincopy
temp = a;
a = b;
b= temp;
这样2个变量中的值就实现了交换。那能不能不引入其他变量就可以实现变量值的交换呢?答案是肯定的。
用异或操作可以实现,有2种实现方法,本质上是一样的。
法1:
[cpp] view
plaincopy
#include <stdio.h>
int main()
{
int a,b;
while(1)
{
scanf("%d %d",&a,&b);
a = a^b; //(1)
b = a^b; //(2)
a = a^b; //(3)
printf("%d %d\n",a,b);
}
return 0;
}
法2:
[cpp] view
plaincopy
#include <stdio.h>
int main()
{
int a,b;
while(1)
{
scanf("%d %d",&a,&b);
b = a^b; //(1)
a = a^b; //(2)
b = a^b; //(3)
printf("%d %d\n",a,b);
}
return 0;
}
因为2种方法本质一样,就方法一进行一下证明。
异或操作满足结合律和交换律,且由异或操作的性质知道,对于任意一个整数a^a=0;
证:(第(2)步中的a) a = a^b = (将第(1)步中的b代入b) a^(a^b) = b;
(第(3)步中的b)b = a^b = (将第(1)步中的b代入b,将第(2)步中的a代入a) a^b^a^a^b = a^a^a^b^b = a;
证毕
http://blog.csdn.net/love_cppandc/article/details/7023238
二、求出现一次的数
题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字
这道题利用异或的几个性质:任何数与其本身异或值都为0,异或运算满足交换律。因此将一组数依次异或,若里面只有一个只出现一次的数,其他的数都出现两次,则最后的结果必然是那个只出现一次的数。要找到两个数字就可以先通过异或整个数组,将得到的结果分组。然后依次安组异或就可以得到所求的值~
代码如下:
?
相关文章推荐
- 异或运算的经典算法题:找出数组中只出现一次的数字,其它数字都出现了两次
- 找出数组中两个只出现一次的数字;异或运算^的一个作用
- 码农小汪剑指Offer之38-数组中只出现一次的数字 异或运算的运用
- 剑指offer--数组中只出现一次的数字--异或运算、二进制运用
- (经典的异或技巧)数组中只出现一次的数字 (两种方法)
- 位运算-Single Number III(只有两个不同的数字出现了一次,其余出现了两次,找出这两个数)
- 异或加密法 在对文本进行简单加密的时候,可以选择用一个n位的二进制数,对原文进行异或运算。 解密的方法就是再执行一次同样的操作。
- 异或的应用 及剑指offer 面试 40 数组中只出现一次的数字
- Python按位异或运算符^应用案例一则:查找只出现一次的数字
- 【leetcode】【Single Number题目】java 异或运算解决数字出现偶数次还是奇数次问题||HashMap
- 数组中只出现一次的问题(异或问题)
- ^异或运算。求解成对出现的一个未成对的数。
- Leetcode# 136. Single Number(出现一次的数&异或)
- 程序员面试100题(算法)之找出数组中两个只出现一次的数字(位运算实现)
- 数组中只出现一次的两个数(异或)
- 在乱序数组中寻找特定出现次数的数字——异或运算
- leetcode之位运算取得数组中只出现一次的一个数
- 百度面试题之找出数组中之出现一次的两个数(异或的巧妙应用)
- 使用异或解题 —— 序列中仅出现一次的两个数
- 位运算 -- 只出现一次的的数字