题目描述
给定一个int类型正整数,请将其二进制上的奇偶位进行互换,如0110->1001
输入格式
一个int类型正整数n
n<=1e8
输出格式
一个int类型正整数
样例输入
6
样例输出
9
样例输入
10
样例输出
5
问题提示
奇偶位交换指第0位和第1位交换,第2位和第3位交换,第4位和第5位交换...
对于一个二进制数0100010110,交换前后为:
0100010110
1000101001
二进制的最低位是从右边看第一个,他就是第0位
可以分成好几步来看
1.先取出偶数位
2.再取出奇数位
3.合并,其实就是交换。而可以在简单,直接将偶数位左移,奇数位右移
接下来的问题就是如何获取二进制中奇数位和偶数位中的内容!
当取出时,就意味着其他位都为0。
这一位能单独给他拿出来。
那个位运算操作能够实现这个呢?
伟大的 按位与 (&)
那么,这时候就要认识两个神奇的数了
0xaaaaaaaa=10101010101010101010101010101010
//偶数位为1,奇数位为0
0x55555555=1010101010101010101010101010101
//偶数位为0,奇数位为1
用输入的数去分别按位与(&)上 0xaaaaaaaa 和 0x55555555
代码很短,用心体会!
CODE:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
int ou=n&(0x55555555);
int ji=n&(0xaaaaaaaa);
cout<<(ou<<1)+(ji>>1);
return 0;
}