1

以下は、一時変数とシフト操作を使用せずに 2 つの数値を交換するプログラムです。

#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

1 つだけが設定されている場合は、各ビットをトグルします。

c = a & (1 << i) = a の i 番目のビットが設定されている場合は true

d = b & (1 << i) = b の 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 ビットが設定されています。1<<i1 ビット オン プレースiセットがあります。このプログラムは各ビットをループし、異なる場合はそれらを交換します。

  • a&(1<<i)aビットが設定されているかどうかをテストiします。
  • ((a&(1<<i))^(b&(1<<i)))iビットインabが異なるかどうかをテストします。
  • a=a^(1<<i)ビットを切り替えますi
于 2012-07-18T09:28:16.063 に答える
0

これは XOR トリックに似ていますが、一度に 1 つのビットのみを交換し、このビットが と で実際に異なる場合にのみ交換しaますb

1<<iビットiは 1 に設定され、他のすべてのビットは 0 に設定されています。

また、これは一時変数を使用せずに2 つの数値を交換しません。一時的なi.

于 2012-07-18T09:27:51.803 に答える