(爱思创)互换奇偶位

题目描述

给定一个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;
}

本文章严禁抄袭,违反者必究!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值