欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

写一个宏可以将一个数字的奇数位和偶数位交换

程序员文章站 2024-03-22 09:53:52
...

如何使用宏将一个数字的二进制的奇数位和偶数为互换,其实也十分简单,这次我们不讲宏的具体使用,我们只来看如何用按位运算来巧妙实现的。


  • 首先要得到一个数的奇数位和偶数位,我们知道一个数的二进制&1后会得到对应的那一位,比如1001&1得到0001,设要转换的数为num,那么num&0101 0101 0101 0101 0101 0101 0101 0101就可以得到他的奇数位了,0101 0101 0101 0101 0101 0101 0101 0101的十六进制为0x55555555,同理,要得到它的偶数位就可以num&1010 1010 1010 1010 1010 1010 1010 1010,j即num&0xAAAAAAAA.

  • 已经得到奇数偶数位了后,剩下的工作就是就是将奇数位和偶数位互换,将(num&0x55555555)<<1,将(num&0xAAAAAAAA)>>1,得到结果后两数 | (按位或)就把奇数和偶数位换位的结果就合并了。

这里有个小细节,有人会将上面写成(num&0x55555555)>>1,(num&0xAAAAAAAA)<<1,这种做法是错误的,最低位是奇数位,向右移就会缺失最低位,所以奇数位必须向左移,偶数位必须向右移

完整代码:

#define _CRT_SECURE_NO_WARNINGS 1
#define EXCHANGE(X) ((x&0x55555555)<<1) | ((x&0xAAAAAAAA)>>1)
#include<stdio.h>
int main()
{
    int x = 9;
    printf(" before: %d\n",x );
    EXCHANGE(x);
    printf("after: %d\n", EXCHANGE(X));
    system("pause");
    return 0;
}

写一个宏可以将一个数字的奇数位和偶数位交换

9的二进制 1001
6的二进制 0110