【C语言】编写函数: unsigned int reverse_bit(unsigned int value) 这个函数的返回值是value的二进制位模式从左到右翻转后的值

这道题我们用25来举个栗子。

32位机器上25这个值包含下列各位:
00000000000000000000000000011001
翻转后:(2550136832
10011000000000000000000000000000
程序结果返回:
2550136832

这段代码的核心就在于实现函数的过程中,循环拿出二进制序列的每一位,并把它们整个翻转过来。那我们只需用value循环向右移动,每移动一位与1进行与运算保留这一位,然后再将它乘相应的权重即可翻转过去。代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<math.h>

unsigned int reverse_bit(unsigned int value)
{
	int i = 0;
	unsigned int ret = 0;
	for (i = 0; i < 32; i++)
	{
		ret += ((value >> i) & 1)*pow(2, 31 - i);
	}
	return ret;
}

int main()
{
	unsigned int ret = 0;
	int n = 0;
	n = 25;
	ret = reverse_bit(n);
	printf("%u\n", ret);
	system("pause");
	return 0;
}

但是其实这段代码并不高效,因为每次调用pow函数的开销是很大的,所以我们避免调用pow函数来完成。更改过的代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<math.h>

unsigned int reverse_bit(unsigned int value)
{
	int i = 0;
	unsigned int ret = 0;
	for (i = 0; i < 32; i++)
	{
		//ret += ((value >> i) & 1)*pow(2, 31 - i);
		ret += ((value >> i) & 1) << (31 - i);
	}
	return ret;
}

int main()
{
	unsigned int ret = 0;
	int n = 0;
	n = 25;
	ret = reverse_bit(n);
	printf("%u\n", ret);
	system("pause");
	return 0;
}

没有任何问题,两段代码结果一样。 

猜你喜欢

转载自blog.csdn.net/Miss_Monster/article/details/81182348