假设我们需要交换的数字为x
将(x&(0x55555555))<<1; x按位与0x55555555后得到的二进制奇数位与x相同但偶数位均为0,然后再向左移一位,偶数位变为原来的奇数位,且移动后奇数位全为0;
将(x&(0xAAAAAAAA))>>1; x按位与0xAAAAAAAA后得到的二进制偶数位与x相同但奇数位均为0,然后再向右移一位,奇数位变为原来的偶数位,且移动后偶数位全为0;
将(x&(0x55555555))<<1; x按位与0x55555555后得到的二进制奇数位与x相同但偶数位均为0,然后再向左移一位,偶数位变为原来的奇数位,且移动后奇数位全为0;
将(x&(0xAAAAAAAA))>>1; x按位与0xAAAAAAAA后得到的二进制偶数位与x相同但奇数位均为0,然后再向右移一位,奇数位变为原来的偶数位,且移动后偶数位全为0;
通过将两个二进制按位或((x&(0x55555555))<<1|(x&(0xAAAAAAAA))>>1)就可以得到最终的数字。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#define SWAP(x)\
(((x&(0x55555555)) << 1) | ((x&(0xAAAAAAAA)) >> 1))
int main()
{
int n = 0;
printf("输入一个整数:");
scanf("%d",&n);
SWAP(n);
printf("交换后为:%d\n", SWAP(n ));
system("pause");
return 0;
}