【发布时间】:2017-07-11 14:26:38
【问题描述】:
我有一个浮点数组,我想在其中进行一些交换。所以,我在网上看了一圈,发现最有效的方法是通过异或交换XOR swap algorithm
所以我有这个代码sn-p:
float tmp;
tmp = x[i];
x[i] = x[j];
x[j] = tmp;
我已经尝试将其更改为 XOR 交换方式:
/*Made sure that address x[i] is different than the one of x[j] */
float* a= &x[i];
float* b= &x[j];
a ^= b;
b ^= a;
a ^= b;
但我明白了:error: invalid operands to binary ^ (have ‘float *’ and ‘float *’)。
老实说,我不是这样的指针专家,有时它会让我感到困惑,所以,谁能告诉我我做错了什么。
【问题讨论】:
-
错误信息中有什么不清楚的地方?位运算仅针对整数类型定义。
-
@A.nechi 首先,使用 XOR 运算符进行交换以及尝试将其用于浮点数通常是一个坏主意。:)
-
@VladfromMoscow On pointers to float numbers - 更糟糕的主意...
-
为什么你认为它是高效的?通常,使用临时变量进行常规交换会更快。
-
从您发布的链接中,大多数现代编译器可以优化掉本机交换中的临时变量,在这种情况下 *本机交换使用相同数量的内存和相同的寄存器数量与 XOR 交换相同,并且至少与 XOR 交换一样快,而且通常更快*。对于不熟悉该技术的人来说,XOR 交换的可读性也差得多,而且完全不透明。 简而言之,只需使用本机交换,即使用临时变量旋转值。