[奇技淫巧] C语言 交换内存内容 memswap

[奇技淫巧] C语言 交换内存内容 memswap

  • 1. 核心思路
  • 2. memswap函数
      • 1) 接口设计
      • 2) 需求分析
      • 3) 代码
  • 3. 参考资料

1. 核心思路

位运算是一个很奇妙的工具. 而最容易被人所忽略的就是异或 ^ 运算符. 对于任何的异或运算都有:

a^0 = a
a^a = 0

异或运算满足交换律和结合律, 因此

a^b = b^a
a^b^c = a^c^b = b^c^a = ... 

由于有上述这些特性, 如果做这样的运算, 假设有两个变量 ab

a = a^b
b = a^b
a = a^b

最终 总为a与b的值互为调换. 证明省略(可根据上述特性得出).

因此, 可创建如下宏, 作为工具.

#define __swap(a,b)                          do{a=a^b;b=a^b;a=a^b;}while(0) 

do + while(0) 以确保内容处于相同的作用域中.




2. memswap函数


1) 接口设计

编写函数, 尤其是用于封装成库的函数, 要考虑接口的通用性, 广泛性及可靠性. 最简单的就是参照C标准库,仿写接口.

查看标准库函数参考可使用以下命令行( 仅适用于Linux 及 macOS ).

man memcpy
man memset
 void *
     memcpy(void *restrict dst, const void *restrict src, size_t n);

DESCRIPTION
The memcpy() function copies n bytes from memory area src to memory area dst. If dst and src overlap, behavior is undefined. Applications in which dst and src might overlap should use memmove(3) instead.

RETURN VALUES
The memcpy() function returns the original value of dst.

 void *
     memset(void *b, int c, size_t len);

DESCRIPTION
The memset() function writes len bytes of value c (converted to an unsigned char) to the string b.

RETURN VALUES
The memset() function returns its first argument.


2) 需求分析

交换内存内容, 需要两片内存的首地址, 以及其对应字节长度. 既然交换, 则默认两片内存长度相同.因此可以拟合出以下接口:

void * 
    __memswap     (void* __a, void* __b, size_t size );

3) 代码

—> size_t
—> uint8_t aka. unsigned char


#include 
#include 

#define __swap(a,b)                          do{a=a^b;b=a^b;a=a^b;}while(0) 
#define __MEM_BYTE( adr )                    ( (*( (uint8_t* )(adr) )) )

void* __memswap     (void* __a, void* __b, size_t size ){
    uint8_t* a = __a;
    uint8_t* b = __b;
    while(size--){
        __swap(__MEM_BYTE(a), __MEM_BYTE(b));
        a++;
        b++;
    }
    return __a;
}

3. 参考资料

[1] MEMCPY(3) BSD Library Functions Manual MEMCPY(3) ISO/IEC 9899:1990 (“ISO C90”).
[2] MEMSET(3) BSD Library Functions Manual MEMSET(3) ISO/IEC 9899:1990 (“ISO C90”).
[3] https://leetcode-cn.com/circle/discuss/CWtfko/

你可能感兴趣的:(接口,linux,c语言,编程语言)