C语言实现 一个数二进制位模式从左到右翻转 reverse_bit

来源:互联网 发布:天下3妖孽男捏脸数据 编辑:程序博客网 时间:2024/06/04 23:35

首先要知道这个数的二进制转化,要实现从左到右的翻转,要么让二进制数从后往前移位,要么就是从后往前读每一位都乘以2^(32-i),最后相加就行了。

举例说明吧:

如在32位机器上15这个值包含下列各位:
00000000000000000000000000001111
翻转后:(4026531840)
11110000000000000000000000000000
标准函数:
unsigned int  reverse_bit(unsigned int value);

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


#include<stdio.h>unsigned int reverse_bit(unsigned int value){int i = 0;int bit = 0;int sum = 0;for(i = 0;i < 32;i++)             //这里从0开始{sum = sum << 1;           //sum左移1位bit = value & 1;          //求出value的最后一位sum = sum | bit;<span style="white-space:pre"></span>  //sum | bit得到左移后的数即为将value最后一位数往前移动一位。.
value = value >> 1;<span style="white-space:pre"></span>  //value右移一位,即最后一位被拿走了,放在sum中.}return sum;}int main(){printf("%u\n",reverse_bit(5));return 0;}
结果如下:



第二种算法:这里用到了幂函数pow


#include<stdio.h>#include<math.h>unsigned int reverse_bit(unsigned int value){int i = 0;int bit = 0;int sum = 0;for(i = 1;i <= 32;i++)                   //这里从1开始{bit = value & 1;<span style="white-space:pre"></span>//取最后一位sum += bit * pow(2,32-i);       //将最后一位前置在最前边,然后依次往前放,最后相加。value = value >> 1;}return sum;}int main(){printf("%u\n",reverse_bit(5));return 0;}
结果是一样的:


注意事项:

1.sum必须要初始化,除了静态变量,全局变量等可以自动初始化,否则会自动初始化随机值。

2.注意两种算法循环的起始点和终止点。比如:第一种方法中,sum左移如果在sum移位之前,那么得到的将不是我们想要的值。

0 0