- 这是一个简单的位运算题目,考察大家的位运算理解能力
- 本文选择使用宏定义来解决这道题目,有需要可以给他改成函数版本
解题思路:
做交换,就直接将二进制位中奇数和偶数部分分别全部提取出来,交换一下位置,再重新以相加或者位运算或的方式求和,即可得到想要的结果。
- 首先要做的是:分别提取给出整数的奇数位和偶数位,即:
- 提取奇数位:(N) & 10101010101010101010101010101010 (0xaaaaaaaa)
- 提取偶数位:(N) 位元素与& 01010101010101010101010101010101 (0x55555555)
- 将奇数位左移一位,偶数位右移一位。
- 相加移位后结果(或者位运算或)。
#define SWAP(N) (((N) & 0xaaaaaaaa)>>1) | (((N) & 0x55555555)<<1)
int main()
{
int n = 10;
printf("%d\n", SWAP(n));
}
注:注意定义宏的时候,宏内容尽量大写,这是约定俗成的写法,方便阅读。
宏定义时,尽量加大括号,以免造成参数是表达式的时候不会出错。
宏的本质是在预编译阶段将宏中的内容替换给代码,其本质是替换,不是传值,所以如果不加括号,很可能会出现运算优先级影响所导致的运算错误。