unsigned short intreverse_bit(unsigned short int b)
{
unsigned short int r = 0;
for (int i=0; i<8; i++) {
b >> = 1
r = (r << 1) | (b & 1);
}
return r;
}
最后一步的取模操作,将之前的结果以每10位一组合并起来。其中利用到了取模的一个特点,当a<b时,a % b = a,而(a + b ) % p = (a % p + b % p) %p,当a + b < p的时候,就有(a + b ) % p = a % p + b % p。而这五组二进制的数的总和也是小于或等于1111111111的,因此最终取模的过程类似于如下操作
unsigned int v; // 要反转的输入,这里的实现支持是多于一个字节的可实现位操作的无符号整数
unsigned int r = v; // r 将会是v的按位反转的结果,下面的for循环会先做右移操作,这里的赋值可以先取得v的最低有效位
int s = sizeof(v) * CHAR_BIT - 1; // 反转后需要做的额外的移位操作次数,CHAR_BIT为8,指一个字节包含的bit数
for (v >>= 1; v; v >>= 1)
{
r <<= 1;
r |= v & 1; //取v的最低位的值,并置于r的最低位
s--;
}
r <<= s; // v为0,s为v中剩余的高位为0的位数,填充到r的末尾