#include <stdio.h> #include <math.h> uint reverse_bit(uint num) { uint ret = 0; int i = 0; for (i = 0; i < 32; i++) { ret += ((num >> i) & 1)*pow(2, 31 - i); } return ret; } int main() { printf("%u\n", reverse_bit(4026531840)); getchar(); return 0; }
要将一个数的所有二进制位翻转过来的话要操作32次,所以要用一个for循环,并且循环32次,所以以 上代码的代码并没有什么不妥,但是细心一分析的话,你就会发现当i循环到31次的时候,num的最低 位已经到了最高位,当循环到32次时,程序结果必然发生错误,所以我们把for循环体改为
for (i = 0; i < 32; i++) { ret <<= 1; ret |= ((num >> i) & 1); }
如果程序改为这样就会好一些,程序消耗掉了i=0这一次循环,因为想左移0位并没有什么实际意义,这
中改法是有用的。