1

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

#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;

但我不知道上面的程序是如何工作的?

4

3 回答 3

2

如果只有一个被设置,它会切换每一位。

c = a & (1 << i) = true 如果 a 的第 i 位被设置

如果设置了 b 的第 i 位,则 d = b & (1 << i) = true

| 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  |
于 2012-07-18T09:35:13.590 回答
1

1 在最右边的位置设置了一位。1<<i有一个位置i集。该程序循环遍历每个位,如果它们不同,则交换它们。

  • a&(1<<i)测试是否设置a了位i
  • ((a&(1<<i))^(b&(1<<i)))测试是否位iab不同。
  • a=a^(1<<i)切换位i
于 2012-07-18T09:28:16.063 回答
0

它类似于 XOR 技巧,但一次只交换一个位,并且仅当该位在aand中实际不同时b

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

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

于 2012-07-18T09:27:51.803 回答