【位操作笔记】位反转算法 容易理解的方法

位反转

这里的位反转(Bit Reversal),指的是一个数的所有bit位依照中点对换位置,例如0b0101 0111 => 0b1110 1010。也可以叫二进制逆序,按位逆序,位翻转等等。

算法说明

该算法用于任意位数的位反转。

位反转算法代码

32位数的位反转代码

unsigned int reverse(unsigned int v)
{
    unsigned int r = v; // r是v的位反转数;这里保存下v的最低有效位
    int s = sizeof(v) * 8 - 1; //用于计算最后需要额外移位的次数

    for (v >>= 1; v; v >>= 1)
    {
        r <<= 1;
        r |= v & 1;
        s--;
    }
    r <<= s; //当v的最高位为零时移位 
    
    return r;
}

8位数的位反转代码

unsigned char reverse(unsigned char v)
{
    unsigned char r = v; // r是v的位反转数;这里保存下v的最低有效位
    int s = sizeof(v) * 8 - 1; //用于计算最后需要额外移位的次数

    for (v >>= 1; v; v >>= 1)
    {
        r <<= 1;
        r |= v & 1;
        s--;
    }
    r <<= s; //当v的最高位为零时移位 
    
    return r;
}

算法来源

Bit Twiddling Hacks

算法计算过程

用abcdefgh表示一个8bit数的8个bit位。

计算过程如下

r = v                       : r = abcdefgh
s = sizeof(v) * 8 - 1       : s = 7
v >>= 1                     : v = 0abcdefg
r <<= 1                     : r = bcdefghg
s--                         : s = 6
v >>= 1                     : v = 00abcdef
r <<= 1                     : r = cdefghgf
s--                         : s = 5
v >>= 1                     : v = 000abcde
r <<= 1                     : r = defghgfe
s--                         : s = 4
……
……
……
v >>= 1                     : v = 0000000a
r <<= 1                     : r = hgfedcba
s--                         : s = 0
v >>= 1                     : v = 00000000
r <<= s                     : r = hgfedcba

最后完成abcdefgh => hgfedcba的位反转操作

假设中途v为0的时候,跳出循环r <<= s
例如这个八位数为0000efgh,此时

v >>= 1                     : v = 0000000e
r <<= 1                     : r = 0efghgfe
s--                         : s = 4
v >>= 1                     : v = 00000000
r <<= s                     : r = hgfe0000

完成0000efgh => hgfe0000的位反转操作。

[参考资料]

Bit Twiddling Hacks By Sean Eron Anderson

[Hacker’s Delight] 作者: Henry S. Warren Jr.

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值