目录
解题分析:
- 题目要求:
- 编写函数: unsigned int reverse_bit(unsigned int value);
- 这个函数的返回值value的二进制位模式从左到右翻转后的值。
- 如: 在32位机器上25这个值包含下列各位: 00000000 00000000 00000000 00011001
- 翻转后:(2550136832)10011000 00000000 00000000 00000000
- 程序结果返回: 2550136832
代码分析一:
思路:
- 首先将整数的每一位提取出来,乘以该位的权值,在依次相加;
- 例如第一次提出的1的权值为2^31,相乘的结果即为2^32,
- 接下来每提出一次0或1,其权值在原来的基础上除以2。
- 而要将求第i位的值,只需将这个整数的二进制序列向右移i-1位,再和1进行按位与操作,即(value>>i-1)&1。
-
#include <stdio.h> #include <math.h> unsigned int reverse_bit(unsigned int value) { int i = 0; int sum = 0; int b = 0; for (i = 0; i < 32; i++) { b = ((value >> i) & 1)*pow(2, 31 - i); sum += b; } return sum; } int main() { int a = 25; int ret = 0; ret = reverse_bit(a); printf("%u\n", ret); system("pause"); return 0; }
代码分析二:
- 将提出的第一位左移31位,
- 第二位左移30位……
- 依次类推,将左移后的结果进行按位或运算即可得到最终结果。
-
#include <stdio.h> #include<stdlib.h> unsigned int reverse_bit(unsigned int value) { int i = 0; int ret = 0; for (i = 0; i < 32; i++) { if (value >> i & 1) { ret |= (value >> i & 1) << (31 - i); } } return ret; } int main() { int a = 25; int ret = 0; ret = reverse_bit(a); printf("%u\n", ret);//此处一定要用%u而不是%d,最高位代表的是符号位,%d为输出有符号整数。 system("pause"); return 0; }
运行结果: