欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 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。)

相关标签: 位运算