写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换
Posted 王不患吖吖吖
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换相关的知识,希望对你有一定的参考价值。
这里实现了交换一个数字的奇数位与偶数位,其交换规律是二进制序列中的第0位与第1位交换,第2位与第3位交换,第4位与第5位交换,……
1.先找到奇数位
2.找到偶数位
3.奇数位右移一位并保存
4.偶数位左移一位并保存
5.进行异或操作
define SWAP_ODD_EVEN(NUM) ((((NUM) & (0X55555555)) << 1) | (((NUM) & (0XAAAAAAAA)) >> 1))
**如何得到奇数位**
int num = 7; // 0 1 1 1
// 奇数位 0 1 只想要得到0 1,就要保证偶数位上的数字为0(清0),
// 奇数位上的数字不发生变化(保留原值),这里考虑按位与,
// 1.奇数位上的数字按位与1则不会发生变化,
// 2.偶数位上的数字按位与0实现清0,
// 于是可以写出这个按位与的数字 0XAAAAAAAA,
// 其二进制序列为:1010 1010 1010 1010 1010 1010 1010 1010
// A A A A A A A A
//
// 1010 1010 1010 1010 1010 1010 1010 1010
// & 0000 0000 0000 0000 0000 0000 0000 0111
// 0000 0000 0000 0000 0000 0000 0000 0010
如何得到偶数位
// 0 1 1 1
// 偶数位 1 1 只想要得到1 1,就要保证奇数位上的数字为0(清0),
// 偶数位上的数字不发生变化(保留原值),这里考虑按位与,
// 1.偶数位上的数字按位与1则不会发生变化,
// 2.奇数位上的数字按位与0实现清0,
// 于是可以写出这个按位与的数字 0X55555555,
// 其二进制序列为:0101 0101 0101 0101 0101 0101 0101 0101
// 5 5 5 5 5 5 5 5
//
// 0101 0101 0101 0101 0101 0101 0101 0101
// & 0000 0000 0000 0000 0000 0000 0000 0111
// 0000 0000 0000 0000 0000 0000 0000 0101
进行左移和右移
// 奇数位 0000 0000 0000 0000 0000 0000 0000 0010
// >> 1 0000 0000 0000 0000 0000 0000 0000 0001
// 偶数位 0000 0000 0000 0000 0000 0000 0000 0101
// << 1 0000 0000 0000 0000 0000 0000 0000 1010
进行操作
// 新的偶数位 0000 0000 0000 0000 0000 0000 0000 0001
// 新的奇数位 |或 0000 0000 0000 0000 0000 0000 0000 1010
// 交换后的数字 0000 0000 0000 0000 0000 0000 0000 1011
// 11
**# define SWAP_ODD_EVEN(NUM) ((((NUM) & (0X55555555)) << 1) | (((NUM) & (0XAAAAAAAA)) >> 1))**
以上是关于写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换的主要内容,如果未能解决你的问题,请参考以下文章