此题的解决思路为:要进行二进制位模式从左到右的翻转,可以考虑将这个数的每一个二进制位拿出来,然后通过运算将它放到最终的位置上。
将这个数的每一个二进制位拿出来:将该数右移i位并按位与1
将拿出来的这个二进制位放到最终对应的翻转位置,可以有多种方法:
①拿到一个二进制位后,直接将它左移。例如最低位的二进制位,直接向左移动31位即可。依次类推,每次累加,即可得到翻转之后的值。
②拿到一个二进制位后,将它乘以翻转之后的二进制的倍数。例如最低位,要得到翻转之后的值,则给它乘以2的31次方,依次类推,每次累加,即可得到翻转之后的值。
③定义一个ret=0,拿到一个二进制位后,把它放在ret的最低位,每次拿到一个将ret左移1,然后补在ret的最地位,这样得到的ret就是最终翻转之后的值。
具体代码如下:
方法一:
#include <stdio.h>
#include <stdlib.h>
unsigned int reverse_bit(unsigned int n)
{
int i = 0;
unsigned int num = 0;
for (i = 0; i < 32; i++)
{
num += ((n >> i) & 1) << (32 - 1 - i);
//向右移动i位按位与1即可拿到第i位
//第i位向左移动32-1-i位即可来到翻转之后的位置
}
return num;
}
int main()
{
int num = 25;
unsigned int ret = reverse_bit(num);
printf("翻转之后的值 ret = %u\n",ret);
//注意:需要用%u来打印,因为1有可能来到最高位上
system("pause");
return 0;
}
方法二:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
unsigned int reverse_bit(unsigned int n)
{
int i = 0;
unsigned int num = 0;
for (i = 0; i < 32; i++)
{
num += ((n >> i) & 1) * pow(2,31-i);
}
return num;
}
int main()
{
int num = 25;
unsigned int ret = reverse_bit(num);
printf("翻转之后的值 ret = %u\n",ret);
//注意:需要用%u来打印,因为1有可能来到最高位上
system("pause");
return 0;
}
方法三:
#include <stdio.h>
#include <stdlib.h>
unsigned int reverse_bit(unsigned int n)
{
int i = 0;
unsigned int num = 0;
for (i = 0; i < 32; i++)
{
num <<=1;//等价num=num<<1
num |= ((n >> i) & 1);//等价num=num|((n >> i) & 1)
}
return num;
}
int main()
{
int num = 25;
unsigned int ret = reverse_bit(num);
printf("翻转之后的值 ret = %u\n",ret);
//注意:需要用%u来打印,因为1有可能来到最高位上
system("pause");
return 0;
}