版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40567865/article/details/83545217
一个数的二进制是由位组成,我们需要对它的每一位进行操作。
第一位翻转:20 —> 2(31-0)
第二位翻转:21 —> 2(31-1)
第三位翻转:22 —> 2(31-2)
第 i 位翻转: 2i-1 —> 2(31-i)
数字value第i位翻转之后的数值大小:(value>>i)&1*2(31-i)
但我们需要把每一个位翻转之后的结果相加,然后得到最终的结果。
所以我们可以写以下代码:
unsigned int reverse_bit(unsigned int value)
{
unsigned int sum = 0;
int i = 0;
for (i = 0; i<32; i++)
{
sum += ((value >> i) & 1) * pow(2, 31 - i);
}
return sum;
}
int main()
{
unsigned int value = 0;
scanf("%d", &value);
printf("%u",reverse_bit(value));//输出时注意要是%u
system("pause");
return 0;
}
第二种方法:我们可以先定义ret,将需要翻转的数value的第一位取出来存到ret中,然后左移,再将第二位取出,与ret执行或运算,这样第二位就保存到ret中的最低位,直到将value的所有位都按照以上步骤存入ret中时,ret就是我们翻转后的值。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <windows.h>
unsigned int reverse_bit(unsigned int value)
{
unsigned int ret = 0;
unsigned int i = 0;
for (i = 0; i<32; i++)
{
ret <<= 1;//左移可以保存当前位翻转之后的值
ret |= (value >> i) & 1;
}
return ret;
}
int main()
{
unsigned int value = 0;
scanf("%d", &value);
printf("%u",reverse_bit(value));
system("pause");
return 0;
}
感谢您的观看!