编写函数:
unsigned int reverse_bit(unsigned int value);
这个函数的返回值是value的二进制位模式从左到右翻转后的值。
如:
在32位机器上25这个值包含下列各位:
00000000000000000000000000011001 (25)
翻转后:(2550136832)
10011000000000000000000000000000
程序结果返回:
2550136832
方法一:
pow(float x, float y) 就是计算x的y次幂
比如说00000000000000000000000000011001
先取最后一位,让它和1进行按位与,那么翻转之后要把这个数放到最高位,即1*2^31
也就是说,我们依次取出value的每i位,再把他翻转,即乘以2^(31-i),就可以得到翻转后的二进制了。
#include<stdio.h>
#include<windows.h>
#include<math.h>
#pragma warning(disable:4996)
unsigned int reverse_bit(unsigned int value)
{
int i = 0;
int ret = 0;
int sum = 0;
for (i = 0; i < 32; i++){
ret = ((value >> i) & 1)*pow(2, 31 - i);
sum += ret;
}
return sum;
}
int main()
{
int value = 0;
printf("please enter a value:");
scanf("%d", &value);
//reverse_bit(value);
int res = reverse_bit(value);
printf("%u\n", res);
system("pause");
return 0;
}
方法二:
依次取出各i位和1进行按位与,再将其左移31-i位,将左移后的结果进行按位或得到最后的结果。
#include<stdio.h>
#include<windows.h>
#pragma warning(disable:4996)
unsigned int reverse_bit(unsigned int value)
{
int i = 0;
int ret = 0;
for (i = 0; i < 32; i++){
if ((value >> i) & 1){
ret |= ((value >> i) & 1) << (31 - i);
}
}
return ret;
}
int main()
{
int value = 0;
printf("please enter a value:");
scanf("%d", &value);
//reverse_bit(value);
int res = reverse_bit(value);
printf("%u\n", res);
system("pause");
return 0;
}
运行结果: