转自: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不能进行位移操作,否则最后一次操作之后的位移会使得代码运行的不正确。
所以我们需要在操作前进行单位位移