将整数的奇偶位互换(奇偶错位异或)
程序员文章站
2022-07-15 14:29:02
...
将整数的奇偶位互换
将一个数字的二进制表达式中的奇偶位的数值交换。
例:9的二进制位1001,奇偶位互换之后为0110,即6。
蓝桥杯备战资料《算法之美》 Chapter1——位运算
一看到这个题目就想到用-1去异或…结果是我没看懂,要求的是奇偶的位置进行交换,并且用-1异或的话每一位的数字都会翻转,正数都变成负数了…
解法:用1010二进制序列得到该数字的二进制奇数位的数,用0101二进制序列得到该数字的二进制偶数位的数,最后将前者右移一位,后者左移一位,进行一次异或就可以得到结果。
#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;
}
(要学习一下0xaaaaaaaa这样的表达式啊…1010在16进制中为a,int类型有32位,所以要有8个a来构成1010序列。而像0xffffffff就是1111序列,表示-1。)
上一篇: 位运算经典例题剖析
下一篇: 位运算 -- 只出现一次的的数字