转:用异或实现两个数的交换的问题
2015-04-17 16:54
323 查看
void swap(int &a,int &b)
{
a^=b;
b^=a;
a^=b;
}
^ 在 C 里面是按位异或操作符。异或运算的原理应该清楚吧?相同的话异或的结果就是 0,不同的话就是 1。举个例子,比如 a 表示十进制的 5,b 表示十进制的 12,按位异或结果就是:
a = 0101 (5 的二进制表示)
b = 1100 (12 的二进制表示)
----
c = 1001 (结果为 9)
复制代码
可以看出 c 中是 1 的部分就是 a 和 b 二进制表示对应位不同的部分,0 则是相同的部分。
然后有两个定理:
任何一位二进制数同 1 异或都会变成另外一个(0 同 1 异或的结果是 1,1 同 1 异或的结果是 0)
任何一位二进制数同 0 异或都保持不变(0 同 0 异或的结果是 0,1 同 0 异或的结果是 1)
因为 c 中是 1 的部分表示 a 和 b 中按位不同的位,0 表示 a 和 b 中按位相同的位,那么 a 同 c 异或的结果就是 a 中与 b 不同的位发生变化,二进制数每位只有两种状态,所以 a 变成了 b:
a = 0101
c = 1001
----
b = 1100
复制代码
同样, b 与 c 异或结果就变成了 a:
b = 1100
c = 1001
----
a = 0101
复制代码
{
a^=b;
b^=a;
a^=b;
}
^ 在 C 里面是按位异或操作符。异或运算的原理应该清楚吧?相同的话异或的结果就是 0,不同的话就是 1。举个例子,比如 a 表示十进制的 5,b 表示十进制的 12,按位异或结果就是:
a = 0101 (5 的二进制表示)
b = 1100 (12 的二进制表示)
----
c = 1001 (结果为 9)
复制代码
可以看出 c 中是 1 的部分就是 a 和 b 二进制表示对应位不同的部分,0 则是相同的部分。
然后有两个定理:
任何一位二进制数同 1 异或都会变成另外一个(0 同 1 异或的结果是 1,1 同 1 异或的结果是 0)
任何一位二进制数同 0 异或都保持不变(0 同 0 异或的结果是 0,1 同 0 异或的结果是 1)
因为 c 中是 1 的部分表示 a 和 b 中按位不同的位,0 表示 a 和 b 中按位相同的位,那么 a 同 c 异或的结果就是 a 中与 b 不同的位发生变化,二进制数每位只有两种状态,所以 a 变成了 b:
a = 0101
c = 1001
----
b = 1100
复制代码
同样, b 与 c 异或结果就变成了 a:
b = 1100
c = 1001
----
a = 0101
复制代码
相关文章推荐
- 用异或实现两个数的交换的问题
- 【C/C++】异或操作巧妙实现两个数的交换操作
- 异或实现两个数的交换
- 不允许创建临时变量,交换两个数的内容(用异或实现)
- 异或运算实现两个数的交换
- 用异或操作实现的交换函数用以实现数组逆置中需要注意的问题
- 由异或实现两个数的交换到RAID技术的数据恢复
- 用异或实现两个数的交换&x&(x-1)表达式作用&计算前1500个丑数
- 异或运算实现两个数的交换
- 异或运算实现两个数的交换
- 异或运算实现两个数的交换
- 异或实现交换两个数
- 异或运算实现两个数的交换
- 用异或操作实现的交换函数用以实现数组逆置中须要注意的问题
- 异或运算实现两个数的交换
- 使用异或实现两个数的交换
- 实现pow(int x, int y),即x的y次方 ; 异或交换两个数;
- 异或运算实现两个数的交换
- 异或运算实现两个数的交换
- 异或运算实现两个数的交换