用异或交换两个变量
Swap two variables with XOR
使用以下方法我们可以交换两个变量A
和B
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。
相关文章:
- 我可以创建一个包含两个变量的 for 循环,但时间复杂度仍然为 O(n) 吗?
- 命令行参数,cant 或两个变量
- 在 for 循环中更新两个变量时遇到问题C++
- C++ 编译时在两个变量之间交替
- C++ 如何在包含两个变量的结构中存储与变量不同数量的值?
- 为什么一个接一个声明的两个变量在内存中不相邻?
- 为什么动态分配的两个变量的内存位置不是连续的?
- 是否可以在C++中使用宏交换两个变量的出现?
- 计算机如何分配两个变量,我们如何计算两个变量之间的距离?
- 正确证明C 中的两个变量合理(我想将它们视为一个变量)
- 可视C 编译器将相同的存储位置提供给两个变量
- 尝试使用 {} 和 std::make_pair() 交换两个变量时的行为不同
- 在rootframework中的根文件中编写两个变量
- 最短路径,带有两个变量
- 加入两个变量和LCD打印
- 在循环中声明两个变量以逆转字符串?在C 中
- 具有两个变量的"for"循环,一个变量每次迭代递增,每隔一次迭代递增
- 如何在C++中使用一个类中两个变量的值
- 仅在C 中的一个变量上,两个变量函数的数值集成(使用数值配方库)
- 如何在我存储的两个变量之间生成随机数