gpt4 book ai didi

c - 应用 XOR 交换算法时的指针问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:29:28 25 4
gpt4 key购买 nike

我有一个 float 组,我想在其中进行一些交换。所以,我在网上四处看看,发现最有效的方法是通过 XOR 交换 XOR swap algorithm

所以我有这个代码片段:

  float tmp;
tmp = x[i];
x[i] = x[j];
x[j] = tmp;

并且我尝试将其更改为异或交换方式:

  /*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;

但我得到这个:错误:二进制 ^ 的无效操作数(有‘float *’和‘float *’)

老实说,我不是专家,有时这让我很困惑,所以,有人能告诉我我做错了什么吗。

最佳答案

编辑

简短的回答:您不能对指针执行按位运算。不幸的是,你cannot perform bitwise operations on floats, either !不要对 float 值使用 XOR 交换。

原创

评论者给了你简短的答案。现在让我来回答一下——

^ 等位运算是为整数定义的。但是,指针不一定是整数。在实模式 x86 上,指针包含两个整数,或以某种方式与两个整数相关:一个段和一个偏移量 ( additional info )。 更糟糕的是,这两个整数重叠,所以改变一个也会改变另一个。因此,没有单一、明确的方法来定义 ^ 或指针的其他按位运算。

很多代码确实假定指针可以被视为整数,因为分段寻址不像以前那样普遍。但是,C 标准仍然必须支持不太常见的体系结构,因此没有定义指针的按位运算。

其余编辑

我看到您链接的示例使用了指针。这是因为,在 C 中,您必须使用指针将值通过参数传递回函数的调用者。 code you linked是:

void xorSwap (int *x, int *y) {
if (x != y) {
*x ^= *y;
*y ^= *x;
*x ^= *y;
}
}

(enwiki,CC-BY-SA 3.0)。您可以在您的上下文中将其称为

if(x[i]!=x[j]) xorSwap(&x[i], &x[j]);

如果 x 是一个 int 数组,它会交换数组元素的内容,正如我想您所期望的那样。当您直接使用 XOR 交换而不是通过函数时,您根本不需要使用指针。例如:

if(x[i]!=x[j]) {
x[i] ^= x[j];
x[j] ^= x[i];
x[i] ^= x[j];
}

应该再次工作,前提是 xint 而不是 float

关于c - 应用 XOR 交换算法时的指针问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45037369/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com