交换函数swap的四种写法

交换函数swap的四种写法:

1、经典法——嫁衣法:

void swap(int *a,int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

2、经典改进法——泛型法:(适用于各种参数类型)

void swap(void *a,  void *b,  int data_type_size) {
    unsigned char *p = (unsigned char *)a;
    unsigned char *q = (unsigned char *)b;
    unsigned char temp;
    while(data_type_size--) {
        temp = *p;
        *p = *q;
        *q = temp;
        p++;
        q++;
    }
}

3、赋值法:

void swap(int *a, int *b) {
    *a = *a + *b;
    *b = *a - *b;
    *a = *a - *b;
}

4、异或运算法:

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

 第三四种方法也可以结合第二种的泛型方法,实现所有数据类型的转换。

关于异或运算:异或运算是指: 参与运算的两个值,如果两个相应位相同,则结果为0,否则为1。

异或的3个特点:

(1) 0^0=0,0^1=1  0异或任何数 = 任何数

(2) 1^0=1,1^1=0  1异或任何数 = 任何数取反

(3) 任何数异或自己 = 0

异或的几个常见用途:

(1)使某些特定位翻转

  例如对数10100001的第2位和第3位翻转,则可以将该数与00000110进行按位异或运算。

  10100001^00000110 = 10100111

(2)实现两个值的交换,而不必使用临时变量。如上第四种方法,实质上使用了  A^A = 0; A^0 = A; 这两条性质。

(3)在汇编语言中经常用于将变量置零:xor ax,ax

(4)快速判断两个整数值是否相等。

  举例1: 判断两个整数a,b是否相等,则可通过下列语句实现:

  return ( (a ^ b) == 0 )

参考

https://www.cnblogs.com/shundong106/p/10213113.html

https://www.cnblogs.com/tmdsleep/p/9933647.html

posted @ 2020-03-18 14:44  SongComps  阅读(1468)  评论(0编辑  收藏  举报