用XOR交换两个变量

通过以下方法,我们可以交换两个变量AB

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

我想在C ++中实现这样一种方法,它可以处理所有类型(int,float,char,...)以及结构。 正如我们所知,包括结构在内的所有类型的数据都需要一个特定的内存空间,例如4个字节,8个字节

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

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


您的问题很容易减少到原始内存的异或缓冲区。 类似的东西。

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

这可以用原始类型的xorswap来实现。 例如:

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()作为练习xorswap8()读者。

还要注意,为了高效,原始缓冲区应该是8字节对齐的。 如果情况并非如此,取决于体系结构,代码可能无法正常工作或根本无法工作(再次,对读者的练习;-)。

其他优化是可能的。 你甚至可以使用达夫的设备展开最后一圈,但我不知道它是否值得。 你必须将其描述成确定的。


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

链接地址: http://www.djcxy.com/p/58197.html

上一篇: Swap two variables with XOR

下一篇: Why does swapping values with XOR fail when using this compound form?