【问题标题】:Is there a case where bitwise swapping won't work?是否存在按位交换不起作用的情况?
【发布时间】:2022-10-01 07:26:44
【问题描述】:

几年前的某天在学校,我不得不做一个交换两个整数的交换函数,我想使用按位运算而不使用第三个变量来做到这一点,所以我想出了这个:

void swap( int * a, int * b ) {
    *a = *a ^ *b;
    *b = *a ^ *b;
    *a = *a ^ *b;
}

本来以为不错,但是学校的改正程序测试我的功能时发现了错误(当然当我问他们不想告诉我的时候),到今天我也不知道是什么没用,所以我想知道这种方法在哪种情况下不起作用。

  • XOR 交换只是太聪明了,以至于你比自己聪明。计算加载、存储和异或操作,并将其与“加载ar1,加载br2,存储r2a,存储r1 到@987654330 @\"。
  • 如果有人调用int x = 5; swap(&x, &x);,它将失败。
  • @SteveSummit 如果任何签名的 int 值是溢出,则会导致未定义的行为。
  • @AndrewHenle 你说的溢出是什么意思?既然我们只是在修改位,它怎么会溢出?
  • Andrew 可能一直在考虑 alternative swap formulation involving subtraction 而不是 XOR。

标签: c bitwise-or


【解决方案1】:

我想使用按位运算而不使用第三个变量来做到这一点

你介意我问为什么吗?这种限制是否有实际原因,还是只是一个智力难题?

当我的功能被学校的纠正程序测试时,它发现了一个错误

我不能确定校正程序抱怨什么,但是已知这类解决方案会失败的一类输入是

int x = 5;
swap(&x, &x);
printf("%d\n", x);

这将打印0,而不是5

你可能会说,“为什么有人要和自己交换东西?” 他们可能不会,正如我所展示的那样,但也许你可以想象,在一个平庸的排序算法中,它最终可能会做相当于

if(a[i] < a[j]) {
    /* they are in order */
} else {
    swap(&a[i], &a[j]);
}

现在,如果ij 是相同的,swap 函数将错误地将a[i] 归零。

另见What is the difference between two different swapping function?

【讨论】:

  • 不,没有任何特别的原因,这只是为了我的个人知识,因为我在一本书中看到了这种方法并且我喜欢它。因此,如果我只是在开头添加if (a == b) return ; 它应该可以工作吗?
  • @Fayeure 据我所知,这会奏效。
  • 如果a[i] &gt; a[j],肯定是i != j(无论如何都是整数)。
  • @Nelfeal 啊,是的。我想我的意思是&gt;=。修好了,谢谢。
  • @Nelfeal 没错。因此,“平庸”。 (但是:我的目标是呈现一个在这种情况下发布的swap() 函数可能会失败,而不是好的一! :-) )
猜你喜欢
  • 1970-01-01
  • 2011-02-22
  • 2016-10-19
  • 1970-01-01
  • 1970-01-01
  • 2014-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多