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

来源:互联网 发布:发明专利 知乎 编辑:程序博客网 时间:2024/06/06 18:07
假设原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位翻转
}

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