如何将一个数的二进制位模式从左到右翻转

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}

感谢您的观看!

猜你喜欢

转载自blog.csdn.net/qq_40567865/article/details/83545217