使用异或交换指针的值

#include <stdio.h>
#include <stdlib.h>

void inplace_swap(int *x, int *y) {
    *y = *x ^ *y;
    *x = *x ^ *y;
    *y = *x ^ *y;
}

int main() {

    int x = 12;
    int y = 23;
    inplace_swap(&x, &y);
    printf("x: %d, y: %d", x, y);
    return 0;
}

对于任意位向量, 有a^a = 0

于是 *x = *x ^ (*x ^ *y ) = (*x ^ *x) ^ *y = *y

*y = *y ^ (*x ^ *y) = *x

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-16 16:20:04

使用异或交换指针的值的相关文章

交换变量的值

方法一:借助第三方变量 1 #region 1 利用第三方变量 2 int a = 10; 3 int b = 20; 4 Console.WriteLine("交换前的值:a={0},b={1}", a, b); 5 Console.ReadKey(); 6 int temp = a; 7 a = b; 8 b = temp; 9 Console.WriteLine("交换后的值:a={0},b={1}", a, b); 10 Console.ReadKey();

C++虚函数表指针的值

前段时间在软件编写过程中碰到一个问题,顺便将感想写一下,虽然不知道是否随编译器的实现而异,但约束一下自己写代码的习惯总没错. 基类虚函数表指针值的变化 若基类中含有虚函数,当创建派生类对象时,虚函数表指针的值在进入派生类构造函数的函数体时会被修改为指向派生类新创建的虚函数表.当基类析构函数被调用时,虚函数表指针的值会被修改为指向基类创建的虚函数表,这样做是为了防止在基类析构函数中访问可能被释放了的派生类的那部分内存(尤其重要).一旦派生对象调用了基类析构函数,则所有指向该派生对象的基类指针都会失

异或交换两个数;实现pow(int x, int y) ,即x的y次方

问题1:异或交换两个数 假设x=2:y=3,我们的目标是(没有蛀牙!!)交换x,y的值: 利用异或的特殊性:x^x=0 即两个相同数字异或后值为0: 解决: 令x=x^y=2^3 令y=x^y=x^y^y=2^3^3=2(此时x=x^y) 令x=x^y=x^y^2=2^3^2=3(此时x=x^y:y=2) 问题2:实现pow(int x, int y) ,即x的y次方 x的y次方就是有y个x连续乘机,代码如下: #include <stdio.h> #include <stdlib.h&

c++函数参数类型-引用、指针、值 [转载]

在编写个人函数的时候,你将会受到C++中的一条基本的原则的限制:在默认的情况下,变量只能以值传递的方式传递给函数.这句话的意思是:被传递到函数的只是变量的值,永远不是变量的本身. 例如: [cpp] view plaincopyprint? void changeVar(int myVar,int newValue) { myVar=newValue; } int main(){ int myNum=20; changeVar(myNum,90); std::cout<<myNum<&l

异或交换数值的分析

异或(^) 跟 按位与(&).按位或(|) 一样是一个位运算符,运算速度自然是很快的. 一般的,它似乎没什么用途.我所知道的它最多就用来加加密,用来交换数值.这里说说使用异或交换数值的一些利弊. 优点: 不需要使用中间变量 一般的交换a,b的值,是使用第三方变量temp temp = a; a = b; b = temp; 可是有一天突然发现了有异或交换数值的方法,这个方法不需要使用第三方变量 a = a ^ b; b = a ^ b; a = a ^ b;  这个方法的写法也很简单:复制3行a

交换两个值,不用临时变量(C位运算)

通常我们交换两个值,都是用一个临时的变量temp,拿交换a,b的值为例,通常的做法是: temp = a; a = b; b = temp; 不过利用位运算,真的是方便很多: 假如 a = 3,b = 4.想将a和b的值互换,可以用一下赋值语句实现: a = a ^ b:        b = b ^ a:        a = a ^ b: 下面用竖式进行简单说明:(10进制化为二进制)            a = 011(^)    b = 100则    a = 111(a ^ b的结果

交换两个值的方法

交换两个值的方法 1.利用temp变量交换 temp=a; a=b; b=a; 2.加减法交换 b = a - b; a = a - b; b = a + b; 3.异或交换 a = a ^ b; b = a ^ b; a = a ^ b; 版权声明:本文为博主原创文章,未经博主允许不得转载.

改变指针的值

#include <iostream> void fun(int** a) { *a = 0;//改变指针的值 } void fun(int*& a) { a = 0;//改变指针的值 } int main() { int a = 90; int* p = &a; fun(p); return 0; }

交换指针

1.今天早上突发奇想,复习一下指针交换,由于一时的忘记,准备写到这里,以备以后复习. 首先指针的交换,必须传地址,而非传值.(你不相信,一会看结果) 下面小小的函数来实现 1 void swap(int *a,int *b) 2 { 3 int tmp = *a; 4 *a = *b; 5 *b = tmp; 6 } 2.接下来通过一个Demo来进行验证.同时我也打印了内存地址,你一看就明白了. 1 #include<iostream> 2 #include<cstdio> 3 u