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

实例:将数组的头尾两端依次对调(采用异或的方法实现两数的交换,不需要临时变量)

#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 < j)
    {
        swap(&a[i], &a[j]);
        ++i;
        --j;
    }
}

int main()
{
    int a[N];
    for(int i = 0; i < N; ++i)
    {
        a[i] = i;
    }
    std::cout << "before: ";
    for(int i = 0; i < N; ++i)
    {
        std::cout << a[i] << " ";
    }
    std::cout << std::endl;

    reverse_arry(a, N);
    std::cout << "after reverse_arrt: ";
    for(int i = 0; i < N; ++i)
    {
        std::cout << a[i] << " ";
    }
    std::cout << std::endl;

}

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

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

使用异或实现两个数的交换的相关文章

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

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 二进制表示对应位不同的部分

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

当遇到交换两个变量的时候,我们通常使用的是借助第三方变量实现两个数的交换.那么如果不使用第三方变量时,该怎么操作呢. 下面有两种方法: 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"