用异或交换两个变量

Swap two variables with XOR

本文关键字:两个 变量 交换      更新时间:2023-10-16

使用以下方法我们可以交换两个变量AB

A = A XOR B
B = A XOR B
A = A XOR B

我想在c++中实现这样一个方法,它可以操作所有类型(int, float, char,…)以及结构体。我们知道所有类型的数据,包括结构,都占用特定的内存空间,例如4字节,8字节

在我看来,这种交换方法必须适用于所有类型,不包括基于指针的类型,它应该交换内存内容,即两个变量的位

我的问题
我不知道如何在c++中实现这样一个与结构(那些不包含任何指针)一起工作的方法。有人能帮帮我吗?

您的问题很容易归结为原始内存的xor-swap缓冲区。差不多吧

void xorswap(void *a, void *b, size_t size);

可以用基本类型的xorswap s来实现。例如:

void xorswap(void *a, void *b, size_t size)
{
    if (a == b)
        return; //nothing to do
    size_t qwords = size / 8;
    size_t rest = size % 8;
    uint64_t *a64 = (uint64_t *)a;
    uint64_t *b64 = (uint64_t *)b;
    for (size_t i = 0; i < qwords; ++i)
        xorswap64(a64++, b64++);
    uint8_t *a8 = (uint8_t*)a64;
    uint8_t *b8 = (uint8_t*)b64;
    for (size_t i = 0; i < rest; ++i)
        xorswap8(a8++, b8++);
}

我把xorswap64()xorswap8()的实现留给读者作为练习。

还要注意,为了提高效率,原始缓冲区应该是8字节对齐的。如果不是这样,根据体系结构的不同,代码可能工作在次优状态或根本不能工作(再次,这是对读者的练习;-)。

其他优化是可能的。你甚至可以使用达夫的设备展开最后一个循环,但我不知道这样做是否值得。你必须对它进行分析才能确定。

您可以使用C中的Bitwise XOR "^"来异或两位。看这里和这里。现在对于XOR 'a'和'b'从东有效位到最高有效位开始XORing。