用XOR交换两个变量
通过以下方法,我们可以交换两个变量A
和B
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'开始从东部有效位异或到最高有效位。
上一篇: Swap two variables with XOR
下一篇: Why does swapping values with XOR fail when using this compound form?