问题:将奇数位和偶数位交换。
思路:将其第0位和第1位交换,第2位和第3位交换,以此类推。
我们将用0x55555555(01010101010101010101010101010101)和X与运算,就能求得X的奇数位,再左移1,就能将奇数位变为偶数位。
同理,用0xAAAAAAAA(10101010101010101010101010101010)和X与运算,就能得到X的偶数位,再右移1,就能将偶数位变为奇数位。
上代码:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define CHANGE_ODD_EVEN(x) (((x&0x55555555)<<1)|((x&0xAAAAAAAA)>>1))
int main()
{
int num = 0;
int changed_num = 0;
int i = 0;
int ret = 0;
int count = 0;
printf("请输入一个数:");
scanf("%d",&num);
printf("这个数的2进制序列是:\n");
for(i=31; i>=0; i--)
{
printf("%d",num>>i&1);
}
printf("\n");
ret = CHANGE_ODD_EVEN(num);
printf("奇数偶数位交换后序列是:\n");
for(i=31; i>=0; i--)
{
printf("%d",ret>>i&1);
}
return 0;
}
结果显示: