将整数的奇偶位互换(奇偶错位异或)

将整数的奇偶位互换(错位异或)

问题描述如下

将一个数字的二进制表达式中的奇偶位的数值交换。

例:9的二进制位1001,奇偶位互换之后为0110,即6。

蓝桥杯备战资料《算法之美》 Chapter1——位运算

一看到这个题目就想到用-1去异或,就是1111B,异或的结果是每一位都取反。

结果是我没看懂题目的要求,要求的是奇偶的位置进行交换。

并且用-1异或的话每一位的数字都会翻转,正数都变成负数了…

在这里插入图片描述

解法
用1010二进制序列得到该数字的二进制偶数位的数
用0101二进制序列得到该数字的二进制奇数位的数
将前者右移一位(低位0会被抹掉),后者左移一位(高位0会被抹掉)
进行一次异或就可以得到结果。
#include<iostream>
using namespace std;

int main(){
	int n;
	cin >> n;
	int a = n & 0xaaaaaaaa;  // 表示1010序列 ,取出偶数位 
	int b = n & 0x55555555;  // 表示0101序列 ,取出奇数位 
	int ans = (a >> 1)^(b << 1);  // 交错异或就可以完成交换 
	cout << ans << endl; 
	return 0;
}

【END】感谢观看

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值