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

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

问题描述如下

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

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

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

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

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

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

将整数的奇偶位互换(奇偶错位异或)_第1张图片

解法
用1010二进制序列得到该数字的二进制偶数位的数
用0101二进制序列得到该数字的二进制奇数位的数
将前者右移一位(低位0会被抹掉),后者左移一位(高位0会被抹掉)
进行一次异或就可以得到结果。
#include
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】感谢观看

你可能感兴趣的:(将整数的奇偶位互换(奇偶错位异或))