【发布时间】:2022-10-01 07:26:44
【问题描述】:
几年前的某天在学校,我不得不做一个交换两个整数的交换函数,我想使用按位运算而不使用第三个变量来做到这一点,所以我想出了这个:
void swap( int * a, int * b ) {
*a = *a ^ *b;
*b = *a ^ *b;
*a = *a ^ *b;
}
本来以为不错,但是学校的改正程序测试我的功能时发现了错误(当然当我问他们不想告诉我的时候),到今天我也不知道是什么没用,所以我想知道这种方法在哪种情况下不起作用。
-
XOR 交换只是太聪明了,以至于你比自己聪明。计算加载、存储和异或操作,并将其与“加载
a到r1,加载b到r2,存储r2到a,存储r1到@987654330 @\"。 -
如果有人调用
int x = 5; swap(&x, &x);,它将失败。 -
@SteveSummit 如果任何签名的
int值是溢出,则会导致未定义的行为。 -
@AndrewHenle 你说的溢出是什么意思?既然我们只是在修改位,它怎么会溢出?
-
Andrew 可能一直在考虑 alternative swap formulation involving subtraction 而不是 XOR。
标签: c bitwise-or