转:用异或实现两个数的交换的问题

void swap(int &a,int &b)
{
a^=b;
b^=a;
a^=b;
}

^ 在 C 里面是按位异或操作符。异或运算的原理应该清楚吧?相同的话异或的结果就是 0,不同的话就是 1。举个例子,比如 a 表示十进制的 5,b 表示十进制的 12,按位异或结果就是:

  1. a = 0101   (5 的二进制表示)
  2. b = 1100   (12 的二进制表示)
  3. ----
  4. 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:

  1. a = 0101
  2. c = 1001
  3. ----
  4. b = 1100

复制代码

同样, b 与 c 异或结果就变成了 a:

  1. b = 1100
  2. c = 1001
  3. ----
  4. a = 0101

复制代码

时间: 2024-08-05 11:12:15

转:用异或实现两个数的交换的问题的相关文章

使用异或实现两个数的交换

实例:将数组的头尾两端依次对调(采用异或的方法实现两数的交换,不需要临时变量) #include <iostream> #define N 10 void swap(int *a, int *b) //交换a,b { *a = *a ^ *b; *b = *a ^ *b; *a = *a ^ *b; } void reverse_arry(int a[], int arry_len) //将数组的头尾两端互换 { int i = 0, j = arry_len-1; while(i <

如何不运用第三方变量实现两个数的交换

当遇到交换两个变量的时候,我们通常使用的是借助第三方变量实现两个数的交换.那么如果不使用第三方变量时,该怎么操作呢. 下面有两种方法: 1.通过已有的两个变量之间的加或减实现: 这种方法对于两个都是无限接进int取值范围,而相加超出int取值范围的情况不适用. 2.通过异或实现(异或符号为^) ******************************************************************************************************

如何不用第三个变量实现两个数的交换

一般我们在写程序时如果遇到两个数需要交换时写作如下: 1 int x,y; 2 3 int temp; 4 5 temp=x;x=y;y=temp; 而如果不允许有第三个变量出现即不允许有temp出现时应该如何做呢?可以写作如下: 1 int x,y; 2 3 x=x+y; 4 5 y=x-y; 6 7 x=x-y;//上述一般可以满足,但是有时候x+y或许或出现上溢或者下溢. 而利用两个数的异或或许更加巧妙—— 异或有如下性质: 交换律:x^y=y^x 结合律:x^(y^z)=(x^y)^z

如何在不介入第三个变量的情况下实现两个数的交换

如何在不介入第三个变量的情况下实现两个数的交换: 1 package myeclipseFiles2; 2 3 public class Operator { 4 5 public static void main(String[] args) { 6 // TODO Auto-generated method stub 7 int a=6; 8 int b=1; 9 System.out.println(a+":"+b); 10 11 //方法一:不借助第三个变量完成两个数的交换 1

利用函数调用实现两个数的交换

#include <stdio.h> #include<stdlib.h> void swap(int *pa, int *pb) { int tmp = *pa; *pa = *pb; *pb= tmp; } int main() { int n1 = 0; int n2 = 0; char *p1 = &n1; char *p2 = &n2; printf("请输入两个数:"); scanf_s("%d%d", &

两个数的交换

方法一:使用函数实现两个数的交换 #include<stdio.h> int fun(int *a,int *b) { int tmp; tmp=*a; *a=*b; *b=tmp; } int main() { int x,y; printf("please input two number:\n"); scanf("%d %d",&x,&y); printf("x=%d,y=%d\n",x,y); fun(&

三种传值方式遇上两个数的交换

最近在学习数据结构的时候发现以前学的C++的有些东西都忘了,特别是老师提到的三种传值的方式——单向值传递,地址传递,双向引用传递:为此,我这里用如何交换两个数的例子来说明一下三种传值方式的机制. 先看看源代码: 1 #include<iostream> 2 using namespace std; 3 int swap1(int m1,int m2)//单向值传递 4 { 5 int temp = m1; 6 m1 = m2; 7 m2 = temp; 8 cout<<m1<

异或运算实现两个数的交换

通常的交换两个变量a,b的过程为 int temp; temp=a a=b; b=temp; 需借助上面的第3个临时变量temp. 采用下面的方法,对于给定两个整数a,b,下面的异或运算可以实现a,b的交换,而无需借助第3个临时变量: a = a ^ b;     b = a ^ b;     a = a ^ b; 这个交换两个变量而无需借助第3个临时变量过程,其实现主要是基于异或运算的如下性质: 1.任意一个变量X与其自身进行异或运算,结果为0,即X^X=0 2.任意一个变量X与0进行异或运算

【c语言】利用指针进行两个数的交换。

#include<stdio.h>void swap(int *a,int *b){    int temp;    temp=*a;    *a=*b;    *b=temp;}void main(){    int a,b,*m,*n;    a=4;    b=5;    m=&a;    n=&b;    printf("a=%d,b=%d\n",a,b);    swap(m,n);    printf("a=%d,b=%d\n"