使用XOR交换两个变量

时间:2014-06-13 07:55:25

标签: c++ xor

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

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

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

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

我的问题
我不知道如何在C ++中实现这样一个使用结构的方法(那些不包含任何指针)。任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:2)

您的问题很容易缩减为原始内存的xor-swap缓冲区。这样的事情。

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()的实施作为练习留给读者。

另请注意,为了提高效率,原始缓冲区应为8字节对齐。如果情况并非如此,根据体系结构的不同,代码可能工作不理想或根本不工作(再次,对读者的练习; - )。

其他优化也是可能的。您甚至可以使用Duff's device展开最后一个循环,但我不知道它是否值得。您必须对其进行分析才能确定。

答案 1 :(得分:0)

您可以使用 C 中的Bitwise XOR "^"对两位进行异或。请参阅herehere。现在 XOR &#39; a&#39;和&#39; b&#39;从东部有效位到最高有效位开始异或。