题目
原文:
写程序交换一个整数二进制表示中的奇数位和偶数位,用尽可能少的代码实现。 (比如,第0位和第1位交换,第2位和第3位交换…)
解答
这道题目比较简单。分别将这个整数的奇数位和偶数位提取出来,然后移位取或即可。
代码如下:
int swap_bits(int x){ return ((x & 0x55555555) << 1) | ((x >> 1) & 0x55555555); }
当然也可以采用更自然的方式来写这段代码:
int swap_bits1(int x){ return ((x & 0x55555555) << 1) | ((x & 0xAAAAAAAA) >> 1); }
上面的代码思路和作用都是一样的,不过按照《Hacker’s delight》这本书里的说法, 第一种方法避免了在一个寄存器中生成两个大常量。如果计算机没有与非指令, 将导致第二种方法多使用1个指令。总结之,就是第一种方法更好。