写一个宏可以将一个数字的奇数位和偶数位交换
程序员文章站
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