前言:
本题为作业
题目描述
给定一个int类型正整数,
请将其二进制上的奇偶位进行互换,
如0110->1001
输入格式
一个int类型正整数n
n<=1e8
输出格式
一个int类型正整数
样例输入
6
样例输出
9
样例输入
10
样例输出
5
问题提示
奇偶位交换指第0位和第1位交换,第2位和第3位交换,第4位和第5位交换...
对于一个二进制数0100010110,交换前后为:
0100010110
1000101001
解题思路
把正整数二进制的奇偶位进行互换
操作如下:
二进制 | 1 | 0 | 0 | 1 |
奇位 | 1 | 0 | ||
偶位 | 0 | 1 | ||
互换后 | 0 | 1 | 1 | 0 |
注:0位算是偶位
1.要取出奇数位和偶数位
可以用
奇数数 &0xaaaaaaaa (1010 1010 1010 1010 1010 1010 1010 1010)
偶数位 &0x55555555 (0101 0101 0101 0101 0101 0101 0101 0101)
2.要实现奇偶位的互换
要将奇数位右移,将偶数位左移
左移右移可以用位运算
<<
>>
3.把以上两个结合在一起就ok了
AC完整代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;//输入原数
int x=0x55555555,y=0xaaaaaaaa;//x取偶位y取奇位
int o=n&x,j=n&y;//分别处理
o<<=1,j>>=1;//左右移
cout<<(o|j);//输出
return 0;
}