《算法营03》
将整数的奇偶位互换
类似下面表格中的情况,将整数二进制中的奇偶位进行互换
0 | 0 | 0 | 1 | 0 | 0 | 1 |
---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 1 | 1 | 0 |
比如:9 的奇偶位互换后得到的结果为 6
实现原理:
1.由于 0 与任何数和与运算的结果都为 0(即消除任何数),而 1 和任何数与运算结果都为任何数本身。
2.故可以先用……0101010101的二进制数与 整数进行与运算 并保存运算的值为X,达到保留奇数位,消除偶数位的效果。
3.反之再用1010101010……的二进制数与 整数进行与运算并保存运算的值为Y,达到保留偶数位,消除奇数位的效果。
4.最后再将保存的值 X, Y 进行错位:令存储奇数位的 X 左移一位,储存偶数位的 Y 右移一位;最后再进行异或运算,求得结果即为 原整数奇偶位互换的结果。
(注意:哪边为偶数位、哪边为奇数位仅由选取的起点决定,本质上只是相隔位进行互换)
代码:
#include<iostream>
using namespace std;
int main()
{
system("color F0");
int n, X, Y, m;
cout << "请输入需要进行奇偶位互换的整数:" << endl; cin >> n; //获取输入的整数
X = n & 0x5555555; //储存奇数位
Y = n & 0xaaaaaaa; //储存偶数位
m = (X << 1) ^ (Y >> 1);
cout << "整数" << n <<"奇偶位互换的结果为:" << m <<endl;
system("pause") ;
return 0;
}
测试结果如图所示:
tip:
1.代码中的 0x 表示十六进制数,十六进制是逢十六进一;
2.也就是可以用0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f表示个位,其中 a 表示十进制中的10,而十进制逢十进一 等同于 二进制逢二进一;
3.故 可用0xaaaaaaaa表示1010101010……
而0x55555555表示0101010101……