问题描述:
编写函数:
unsigned int reverse_bit(unsigned int value);
这个函数的返回值是value的二进制位模式从左到右翻转后的值。
如:
在32位机器上25这个值包含下列各位:
00000000000000000000000000011001
翻转后:(2550136832)
10011000000000000000000000000000
程序结果返回:
2550136832
问题分析:
方法一:
1、输入一个数,并传值给reverse_bit(unsigned int value);
2、定义一个数组,对传进来的数通过对 2 取模方式求得每一位,并存入数组;
3、通过对数组数据按照二进制存储方式处理,并求得最终结果,公式如下:
sum += (a[31-i]*pow(2,i));
4、打印结果。
方法二:
1、输入一个数,并传值给reverse_bit(unsigned int value);
2、对传进来的数通过对 2 取模方式求得每一位,这一位正好就是反转之后二进制数第一位;
3、通过对数据按照二进制存储方式处理,并求得最终结果,公式如下:
sum += (value % 2)*pow(2,31-i);
源代码:
方法一:
注:
函数 pow(x , y) 返回值为:x 的 y 次幂的值;
函数头文件为:#include <math.h>;
#include <stdio.h>
#include <math.h>
#include <windows.h>
#pragma warning(disable:4996)
unsigned int reverse_bit(unsigned int value)
{
int a[32] = { 0 };
int i = 0;
int sum = 0;
for (i; i < 32; i++)
{
a[i] = (value % 2);
value /= 2;
}
for (i=0; i < 32; i++)
{
sum += (a[31-i]*pow(2,i));
}
return sum;
}
int main()
{
unsigned int value = 0;
printf("Please enter a number:");
scanf("%d", &value);
int result = reverse_bit(value);
printf("%d\n", result);
system("pause");
return 0;
}
方法二:
#include <stdio.h>
#include <math.h>
#include <windows.h>
#pragma warning(disable:4996)
unsigned int reverse_bit(unsigned int value)
{
int i = 0;
int sum = 0;
for (i; i < 32; i++)
{
sum += (value % 2)*pow(2,31-i);
value /= 2;
}
return sum;
}
int main()
{
unsigned int value = 0;
printf("Please enter a number:");
scanf("%d", &value);
int result = reverse_bit(value);
printf("%d\n", result);
system("pause");
return 0;
}
对比:
很明显方法二比方法一要简洁明了,最重要的是方法二时间、空间复杂度都小于方法一。
好的程序猿写代码一定要考虑到时间、空间复杂度问题,争取用最优方案。