爱思创 180818 互换奇偶位
思路
求解目标
给定一个正整数,输出将其二进制上的奇偶位进行互换后的数
例如:
| 6的二进制 | 0 | 1 | 1 | 0 |
|---|---|---|---|---|
| 奇数位 | 0 | 1 | ||
| 偶数位 | 1 | 0 | ||
| 交换后 结果是9 | 1 | 0 | 0 | 1 |
二进制最低位是0位,0算是偶数位
那么我们要将奇数位右移一位,将偶数位左移一位
左移右移可以用位运算处理
所以最终目的是求奇数位和偶数位
这里讲一个技巧
因为
1 & x = x
0 & x = 0
所以要截取一些二进制位就可以把要取的位&1,剩下的&0
例如
| 14的二进制 | 1 | 1 | 1 | 0 |
|---|---|---|---|---|
| 取 | 否 | 是 | 否 | 是 |
| 15& | 0 | 1 | 0 | 1 |
| 结果是4 | 0 | 1 | 0 | 0 |
所以要求奇数位就要 &0xaaaaaaaa (1010 1010 1010 1010 1010 1010 1010 1010)
要求偶数位就要 &0x55555555 (0101 0101 0101 0101 0101 0101 0101 0101)
完整代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int x;
cin >> x;
int ou = 0x55555555, ji = 0xaaaaaaaa;//要取的位
int ow = x & ou, jw = x & ji;//取的位
ow <<= 1, jw >>= 1;//交换奇偶位
cout << (ow + w);//结合
return 0;
}
hello, I'm yuzihang, if you need to copy this, please quote this url: https://www.cnblogs.com/yuzihang/articles/16906676.html

浙公网安备 33010602011771号