题目描述:
请编写函数,这个函数的返回值是把value的二进制位模式从左到右变换一下后的值。例如,在32位机器上,25这个值包含下列各个位:
000000000000000000000000000000011001
函数的返回值应该是2550136832,它的二级制位模式是:
100110000000000000000000000000000000
编写函数时要注意不要让他依赖于你的机器上整型值得长度。
方法一:利用二进制数转化为十进制数的计算规则来编写,代码如下:
#include<stdio.h>
#include<windows.h>
#include<math.h>
unsigned int reverse_bit(int num)
{
int i = 0;
unsigned int sum = 0;
for (i = 0; i < 32; i++)
{
sum += ((num >> i) & 1) * pow(2.0, 31 - i);
}
return sum;
}
int main()
{
int num = -1;
unsigned int ret=reverse_bit(num);
printf("ret=%u\n", ret);//%u 表示无符号10进制整数
system("pause");
return 0;
}
这里的(num >> i) & 1意思是依次取这个数二进制位模式下的最右面的那一位数,一共取32次。这样就可以把二进制位模式下的每一位数,都提取出来了。
方法二:利用十进制数转化为二进制数的计算规则来编写,代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main()
{
unsigned int n;
int sn = 2;//表示二进制
scanf("%u", &n);
int i;
unsigned int tmp, sum = 0;
for (i = 0; i < 32;i++)
{
tmp = n % sn;
n/=sn;
sum = sum * sn + tmp;
}
printf("%u\n", sum);//%u 表示无符号10进制整数
return 0;
}
这里利用n%sn得到每一次的余数,也就是依次得到这个数二进制位模式下从左到右的每一位数,并将它存放在tmp中,而这里的 sum=sum*sn+tmp和第一种方法中的pow(2.0,31-i)有着异曲同工之妙。
方法三:利用位运算规则来编写,代码如下:
#include<stdio.h>
#include<windows.h>
#include<math.h>
unsigned int reverse_bit(int num)
{
int i = 0;
int ret = 0;
for (i = 0; i < 32; i++)
{
ret <<= 1;
ret |=((num >> i) & 1);
}
return ret;
}
int main()
{
int num = 25;
unsigned int ret=reverse_bit(num);
printf("ret=%u\n", ret);//%u 表示无符号10进制整数
system("pause");
return 0;
}
这里的 ret<<=1 的意思是,将ret向左移一位,而((num >> i) & 1)的意思是依次得到这个数二进制位模式下最右面的那一位数,最后再 |ret,而 ret|((num >> i)&1)的意思是,每次得到这个数二进制位模式下最右面的那一位数后,将这个数变成ret的最右面的那个数。