【问题标题】:C Swapping with shifting bitsC 移位移位
【发布时间】: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 后跟 x 0s 的二进制相同,所以它只是利用了这一点(我相信它一次交换一位)。
  • 这真的很低效,是我见过的最糟糕的“交换”实现,此外,如果int 恰好是 16 位宽,它还会出现整数溢出。你从哪里弄来的这些垃圾?
  • 对于每一个像上面xor 这样的速记/智能编程技巧,都会杀死一只小猫!必须阅读的程序员会追捕负责人!

标签: c


【解决方案1】:

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

c = a & (1

d = b & (1

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

【讨论】:

    【解决方案2】:

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

    • a&amp;(1&lt;&lt;i) 测试 a 是否设置了位 i
    • ((a&amp;(1&lt;&lt;i))^(b&amp;(1&lt;&lt;i))) 测试 ab 中的位 i 是否不同。
    • a=a^(1&lt;&lt;i) 切换位 i

    【讨论】:

      【解决方案3】:

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

      1&lt;&lt;i 的位 i 设置为 1,所有其他位设置为 0。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多