【发布时间】:2012-07-18 09:24:46
【问题描述】:
这是一个不使用临时变量和移位操作来交换两个数字的程序:
#include <stdio.h>
#include <conio.h>
int main(void)
{
int a,b,i,j;
clrscr();
printf(“Enter two integers: “);
scanf(“%d%d”,&a,&b);
printf(“a=%d,b=%d\n”,a,b);
for(i = 0; i < 16; i++)
{
if((a & (1 << i)) ^ (b & (1 << i)))
{
a = a ^ (1 << i);
b = b ^ (1 << i);
}
}
printf(“a=%d,b=%d”,a,b);
getch();
return 0;
}
我的问题是 1 在这个程序中的意义是什么? 我知道 xoring 的方法如下
a = a^b;
b = a^b;
a = a^b;
但我不知道上面的程序是如何工作的?
【问题讨论】:
-
请永远不要真正交换类似的东西(甚至使用 3 行 xor 版本)。无论如何, 1 1 后跟
x0s 的二进制相同,所以它只是利用了这一点(我相信它一次交换一位)。 -
这真的很低效,是我见过的最糟糕的“交换”实现,此外,如果
int恰好是 16 位宽,它还会出现整数溢出。你从哪里弄来的这些垃圾? -
对于每一个像上面
xor这样的速记/智能编程技巧,都会杀死一只小猫!必须阅读的程序员会追捕负责人!
标签: c