//将整形的二进制数翻转再求值
/*
*****************************************************************************
例如:
25 = 0000 0000 0000 0000 0000 0000 0001 1001 翻转前
2550136832 = 1001 1000 0000 0000 0000 0000 0000 0000 翻转后
*****************************************************************************
*/
/*
*****************************************************************************
左移操作符 << 左边抛弃,右边补0 左移一次,相当于 *2
右移操作符 >> 逻辑移位(无符号) 左边补0,右边抛弃 右移一次,相当于 /2
算术移位 左填符号,右边抛弃(取决于编译器)
*****************************************************************************
*/
#include<stdio.h>
#include<math.h>
//********************************************************
<span style="color:#ff0000;">
unsigned int reverse_bit(unsigned int value)
{
int sum = 0;
int count = 0;
int i = 32;
while(i)//此处不能用value做条件表达式
{
i--;
count = value % 2;
sum = sum + count * pow(2,i); //这里引入了一个求一个数次方的函数,pow()返回值为double型
value = value >> 1; //右移操作符“>>” 效率高于“/”
}
return sum;
}</span>
//********************************************************
<span style="color:#006600;">
unsigned int reverse_bit1(unsigned int value)
{
int sum = 0;
int count = 0;
for(int i=0;i<=31;i++)
{
count = value % 2;
sum = sum + count * pow(2,31-i); //这里引入了一个求一个数次方的函数,pow()返回值为double型
value = value >> 1; //右移操作符“>>” 效率高于“/”
}
return sum;
}</span>
//*******************************************************
<span style="color:#000099;">
unsigned int reverse_bit2(unsigned int value)
{
int bit = 0;
int ret = 0;
for(int i=0;i<=31;i++)
{
ret <<= 1;
bit = value % 2;
ret |= bit;
value /= 2;
}
return ret;
}</span>
<pre name="code" class="cpp">//*******************************************************
int main()
{
int ret = reverse_bit(2);
printf("%u\n",ret);
int b = reverse_bit1(2);
printf("%u\n",b);
int a = reverse_bit2(2147483648);
printf("%u\n",a);
return 0;
}