这是一个使用临时变量和使用移位操作交换两个数字的程序:
#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;
但我不知道上述程序是如何运作的?
答案 0 :(得分:2)
如果只设置了一个,它会切换每个位。
c = a&amp; (1&lt;&lt; i)=如果设置了第i位,则为真
d = b&amp; (1&lt;&lt; i)=如果设置了第i位,则为真
| c | d | Action | c' | d' |
-------------------------------------
| 0 | 0 | Do nothing | 0 | 0 |
| 0 | 1 | Toggle the bits | 1 | 0 |
| 1 | 0 | Toggle the bits | 0 | 1 |
| 1 | 1 | Do nothing | 1 | 1 |
答案 1 :(得分:1)
1在最右边的位置设置有一位。 1<<i
设置了一个位i
。这个程序循环遍历每个位,如果它们不同则交换它们。
a&(1<<i)
测试a
是否设置了位i
。((a&(1<<i))^(b&(1<<i)))
测试i
和a
中的位b
是否不同。a=a^(1<<i)
切换位i
。答案 2 :(得分:0)
它类似于XOR技巧,但是一次只交换一个位,并且只有在a
和b
中该位实际不同时才会交换。
1<<i
将位i
设置为1,将所有其他位设置为0。
此外,这不会在不使用临时变量的情况下交换两个数字。它使用临时i
。