您的位置:首页 > 编程语言

c编程之逆转比特位

2017-12-12 23:44 239 查看
编写一个函数,unsigned int reverse_bit(unsigned int value);

这个函数的返回值value的二进制位模式从左到右翻转后的值。

如:

在32位机器上25这个值包含下列各位:

00000000000000000000000000011001

翻转后:(2550136832)

10011000000000000000000000000000

程序结果返回:

2550136832

第一种做法,比较容易想,实际上就是将该位的权改变一下,我们都知道二进制序列中最低位是2^0,最高位是2^31,所以就把x的权该为目标位的权。

比如:25的二进制序列11001

最低位的1乘上2^31就将1移到了最高位,以此类推。

unsigned int  bit_reverse(unsigned int x)
{
int ret = 0;
int i = 0;
for (i = 0; i < 32; i++)
{
ret += ((x >> i) & 1)*pow(2, 31 - i);
}
return ret;
}


unsigned int bit_reverse(unsigned int x)
{
int value = 0;
int top = 32;
int i = 0;
for (i = 0; i < top; i++)
{
if (x&(1 << i))
{
value |= (1 << ((top - 1) - i));
}
}
return value;
}
int main()
{
char str[33];
int data = 0;
printf("please enter:");
scanf("%d", &data);
printf("二进制:%s",itoa(data,str,2));
printf("\n");
printf("after reverse:%u\n", bit_reverse(data));
printf("二进制:%s\n", itoa(bit_reverse(data), str, 2));

system("pause");
return 0;

}


在这里,我采用了用c库中的itoa函数将2进制比特位打印出来可以方便我们校验。



分析:

我们可以分为两部分考虑,第一步将x中的数取出来。按位&1,可以将该位取出,所以将x从低位起的每一位都按位&1,就能将x中的全部取出。

第二步考虑如何放的问题。value初值32个比特位全赋0,将x中取出的1,右移至对应的逆置之后的高位比特位,与value(0)按位|就能将value的该位置1,零则不用管它。

比如说,25的二进制序列11001

将最低位的1取出来,左移31位 按位|0 就到了最高比特位并且置1,此时就存到value中了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: