C使用移位进行交换

时间:2012-07-18 09:24:46

标签: c

这是一个使用临时变量和使用移位操作交换两个数字的程序:

#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 个答案:

答案 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)))测试ia中的位b是否不同。
  • a=a^(1<<i)切换位i

答案 2 :(得分:0)

它类似于XOR技巧,但是一次只交换一个位,并且只有在ab中该位实际不同时才会交换。

1<<i将位i设置为1,将所有其他位设置为0。

此外,这不会在不使用临时变量的情况下交换两个数字。它使用临时i