逆置无符号整数二进制位

转自:http://blog.kingsamchen.com/archives/647


前两天看Pointers On C时碰到的问题,问题的详细描述如下:

编写一个函数,该函数接受一个无符号的整数(unsigned int),将这个整数在二进制上进行逆置(即逆置bit位)。

如,十进制的整数7的二进制位是 0000 0000 0000 0111,逆置后的结果为 1110 0000 0000 0000,这个数是3758096384。

函数应当返回逆置后的数。

需要注意的是,为了保持可移植性,并不假设int类型具有32bit长,所以编写的函数要能同时对16bit和32bit有效。

解决问题的关键是,如何正确处理不同字节长。

实际上,我们并不一定需要知道具体的字节长,我们只需要知道何时操作应该停止即可。

联想bitwise相关内容,这里使用一个unsigned int的标志变量i,且将其初始化为1,并对变量i执行单位左移操作。

当i的值为0时,表示左移出界,此时操作应该停止。

demo如下:

[code=c/c++]
typedef unsigned int uint;

// reverses value on bit based

uint ReverseBit(uint value)
{
    uint answer = 0U;
    for (uint i = 1U; i != 0; i <<= 1)
    {
        answer <<= 1;
        if (value & 1)
        {
            answer |= 1;
        }
        value >>= 1;
    }
    return answer;
}

[/code]

我们每次检测value的第一位(最低位),根据结果设置answer的相应位。

每次操作前,answer都需要右移一位,为下一次操作留出空间。这么做有两个原因:

其一,右移后,之前的bit值会上升到高位,正好迎合我们逆置的目标

其二,每次操作后,answer不能进行位移操作,否则最后一次操作之后的位移会使得代码运行的不正确。

所以我们需要在操作前进行单位位移


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值