将整数的奇偶位互换(错位异或)
问题描述如下
将一个数字的二进制表达式中的奇偶位的数值交换。
例: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】感谢观看