【问题标题】:Interchanging values of two variables by xor operator using references or pointers通过 xor 运算符使用引用或指针交换两个变量的值
【发布时间】:2012-06-13 20:57:52
【问题描述】:

我有两个整数变量 i 和 j,我想创建一个函数,将这两个变量作为参数,并使用 xor 运算符交换它们的内容。现在,如果我让函数按值获取参数,即void swap (int x , int y);(函数体与下面的函数swap 相同),那么值将在函数内很好地交换。但是我想要的是在调用函数中交换变量的值,我使用通过引用(以及通过指针)传递参数:

void swap ( int& x , int& y )
{
    x^=y^=x^=y;
    cout << x<< " " << y << endl ;
}

int main ()
{
    int i (1), j (2) ;
    swap ( i, j ) ;
    cout << i << " " << j << endl ;
}

但两种情况都没有显示正确的结果!

为什么swap 函数不交换通过引用或指针传递参数的值?

【问题讨论】:

  • :你知道c++有std::swap吗?所以你不必做不明智的事情,比如异或交换。
  • Xor 交换在任何情况下都是不可取的,除非您正在实现特定于系统的库函数并且已经证明它在您的系统上更快。当x 别名y 时,您还没有解决可怕的故障模式。
  • @cirronimbo:在 (在 C++03 中)或 (在 C++11 中)中没有std::swap
  • (1) 你只是在猜测它更快 (2) 你写的它可能会混淆一些旧的编译器并且它有别名错误和 (3) 它比仅仅写不太清楚temp = y; y = x; x = temp。写下你的意思并让编译器优化,除非你证明这还不够好。

标签: c++ reference swap xor


【解决方案1】:

正如其他人所指出的,这是一个非常愚蠢的优化(如果你可以这样称呼它的话)。问题是就地操作符的链式使用。将其分解为可分离的语句,它可以工作。

x^=y;  // values are X^Y, Y
y^=x;  // values are X^Y, X
x^=y;  // values are Y, X

像其他人一样,我鼓励你不要用这种破坏清晰度的聪明来迷惑你的代码,除非你有一个通过分析建立的明显需求和一个明显的加速来执行你的bit twiddling hack。 (酷网站)

【讨论】:

  • 谢谢。我应该弄清楚这一点。我总是倾向于忘记序列点..
【解决方案2】:

我有两个整数变量 i 和 j,我想做一个函数 它将这两个变量作为参数并交换它们 内容使用 xor 运算符。

为什么?

如您所见,您需要传递指向对象的指针或使用引用。

这个:

x^=y^=x^=y;

具有未定义的行为,因为它在序列点之间修改了同一个对象两次(它对xy 都这样做)。

如果两个对象是同一个对象,异或技巧就会失败;第一个异或将对象归零。

如果要交换两个对象,只需使用临时对象:

int temp = x;
x = y;
y = temp;

这很简单,而且它有效

【讨论】:

  • 这意味着即使我让函数采用 按值参数 那么我也可能在其他编译器中得到错误的结果?
  • 是的,虽然事物的按值或按引用与 x^=y^=x^=y 未定义这一事实没有任何关系。
  • 我喜欢 Python 的原因之一,轻松交换 :-) x, y = y, x
  • @Levon - std::swap(x, y) 也不错。但有些人只是想让它变得艰难。
猜你喜欢
  • 2014-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-01
  • 2013-03-07
相关资源
最近更新 更多