爱思创 180818 互换奇偶位

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;
}
posted @ 2022-11-19 18:06  yuzihang  阅读(58)  评论(0)    收藏  举报