版权声明:[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;
}