转载 分治法的绝妙应用-求bit翻转收藏

新一篇: 一个笔试题的分析 | 旧一篇: How to Design a Good API and Why it Matters

假设原32bits 字符串丛左到右为 0 1 2 3 4 5。。。。。31
反转将第0位和第31位互换,第1位和第30位互换
最终结果 排序为31,30,29,28。。。。。。。。。1,0


反转n位=反转前面n/2位 >>n/2  ¦ 反转后面n/2位 <<n/2;用非递归实现的代码:
unsigned int
reverse(register unsigned int x)
{
        register unsigned int y = 0x55555555;
        x = (((x  >> 1) & y)  | ((x & y)  << 1)); //将临近的1位翻转
        y = 0x33333333;
        x = (((x  >> 2) & y)  | ((x & y)  << 2));//将临近的2位翻转
        y = 0x0f0f0f0f;
        x = (((x  >> 4) & y)  | ((x & y)  << 4));//将临近的4位翻转
        y = 0x00ff00ff;
        x = (((x  >> 8) & y)  | ((x & y)  << 8));//将临近的8位翻转
        return((x  >> 16)  | (x  << 16));//将临近的16位翻转
}

算法真的博大精深,这个人的解法更是非常的巧妙,太佩服了。

发表于 @ 2007年09月29日 21:39:00|评论(loading...)|编辑

新一篇: 一个笔试题的分析 | 旧一篇: How to Design a Good API and Why it Matters

评论:没有评论。

发表评论  


当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
Csdn Blog version 3.1a
Copyright © Jackiezhw