.编写函数: unsigned int reverse_bit(unsigned int value); 这个函数的返回值value的二进制位模式从左到右翻转后的值。

版权声明:[email protected] https://blog.csdn.net/qq_271334644/article/details/83659988

unsigned int reverse_bit(unsigned int value); 
这个函数的返回值value的二进制位模式从左到右翻转后的值。 


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

方法①

计算思路:

移位:

取出第I位的值:(n>>i)&1

ret(初始值为0)保存第I位的值   ret  | =(n>>i)&1-->把第i位的值保存在ret二进制中的第一位

ret=00000

n  =10011

第一位: 00001

ret--->  00000 | ---->00001 ----->ret

ret<<1  ----> 00010 --->ret

第二位:  00001

ret ----> 00010  | ---->00011 ---->ret

ret << 1 ---->  00110  ---->ret

第三位  : ret ---->01100

第四位 : ret ---->11000

第五位 :ret ----> 11001

程序实现

#include<stdio.h>
#include<stdlib.h>
unsigned int  reverse_bit(unsigned int n){
	int i = 0;
	unsigned ret = 0;
	for (i = 0; i < 32; ++i){
		//保存上一位的结果
		ret <<= 1;
		//把当前为的结果保存在ret的第一位
		ret |= (n >> i) & 1;
	}
	return  ret;
}
int  main(){
	unsigned int n = 25;
	printf("%u\n", reverse_bit(n));
	 
	system("pause");
	return 0;
}

方法②

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
unsigned int  reverse_bit(unsigned int n){
	unsigned int sum = 0;
	int i = 0;
	for (i = 0; i < 32; ++i){
		sum += ((n >> i) & 1)*pow(2, 31 - i);
	}
	return  sum;
}
int  main(){
	unsigned int n = 25;
	printf("%u\n", reverse_bit(n));
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_271334644/article/details/83659988