题目
原文:
Write a program to swap odd and even bits in an integer with as few instructions as possible (e.g., bit 0 and bit 1 are swapped, bit 2 and bit 3 are swapped, etc).
译文:
写程序用尽可能少的指令实现对一个整数的二进制的奇偶位进行交换(如:bit0位和bit1位互换,bit2位和bit3位互换,等)
解答
分别将这个整数的奇数位和偶数位提取出来,然后移位取或即可。
代码如下:
public static int swap_bits(int x){
return ((x&0x55555555)<<1)|((x>>1)&0x55555555);
}
当然也可以采用更自然的方式来写这段代码:
public static int swap_bits1(int x){
return ((x&0x55555555)<<1)|((x&0xAAAAAAAA)>>1);
}
上面的代码思路和作用都是一样的,不过按照《Hacker’s delight》这本书里的说法, 第一种方法避免了在一个寄存器中生成两个大常量。如果计算机没有与非指令, 将导致第二种方法多使用1个指令。总结之,就是第一种方法更好。(参考:http://hawstein.com/posts/5.6.html)
完整代码如下:
class Q5_6{
public static void print_binary(int x){
String s="";
for(int i=0;i<32&&x!=0;++i,x>>=1){
if((x&1)==1) s="1"+s;
else s="0"+s;
}
System.out.println(s);
}
public static int swap_bits(int x){
return ((x&0x55555555)<<1)|((x>>1)&0x55555555);
}
public static int swap_bits1(int x){
return ((x&0x55555555)<<1)|((x&0xAAAAAAAA)>>1);
}
public static void main(String[] args){
int x = -7665543;
print_binary(x);
print_binary(swap_bits(x));
print_binary(swap_bits1(x));
}
}
---EOF---