A Za, A Za, Fighting...

坚信:勤能补拙

2011面试题 - 逆转整数的二进制表示

问题:
写一个函数 unsigned RevBit(unsigned val);

unsigned x = RevBit(0xf0ec9999);
x应该为 0x9999370f。

0xf0ec9999 == 11110000111011001001100110011001(二进制)

0x9999370f == 10011001100110010011011100001111(二进制)


思路:相邻两位互调位置(即一位换一位),再相邻的两位换两位,在相邻的四位与四位互调位置,再八位与八位互调位置,最后前十六位和后十六位互换位置,完成32位整数逆转。思路与归并排序相似。

代码:
#include <stdio.h>;
 
unsigned RevBit(unsigned x)
{
x
=(x&0x55555555)<<1|(x>>1)&0x55555555;
x
=(x&0x33333333)<<2|(x>>2)&0x33333333;
x
=(x&0x0f0f0f0f)<<4|(x>>4)&0x0f0f0f0f;
x
=(x&0x00ff00ff)<<8|(x>>8)&0x00ff00ff;
x
=x<<16|x>>16;
return x;
}
 
int main()
{
unsigned x 
= RevBit(0xf0ec9999);
printf(
"%x\n",x);
return 0;
}

更多解法: http://graphics.stanford.edu/~seander/bithacks.html#BitReverseObvious

posted on 2011-09-04 16:03 simplyzhao 阅读(336) 评论(0)  编辑 收藏 引用 所属分类: R_找工复习2011


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


导航

<2010年9月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

统计

常用链接

留言簿(1)

随笔分类

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜