#include<stdio.h>
#include<windows.h>
#pragma warning (disable:4996)
int swap( int number){
// 将 number 的二进制,奇数位与偶数位分开。
// 将 number & (101010...10)保留 number 奇数位
// 32位: 1010 1010 1010...1010 ---> 0xaaaaaaaa
int n1 = number & 0xaaaaaaaa;//奇数位
// 将 number & (010101...01)保留 number 偶数位
// 32位: 0101 0101 0101...0101 ---> 0x55555555
int n2 = number & 0x55555555;//偶数位
//如: 1 0 0 1
// n1 = 1 0 0 0
// n2 = 0 0 0 1
// 将奇数位(n1)向左移动一位, 1 0 0 0
//偶数位(n2)向右移动一位, 0 0 0 1
// 即可得到: 0 1 0 1 0
n1 = n1 >> 1;//奇数位右移
n2 = n2 << 1;//偶数左位移
number = n1^n2;
return number;
}
int main()
{
int n = 0;
scanf("%d",&n);
int number = swap(n);
printf("%d",number);
system("pause");
return 0;
}
算法之美——将整数的奇偶位互换(奇偶错位异或)
最新推荐文章于 2022-01-09 09:39:34 发布