递归位逆向程序

Recursive bits reverse program

递归反向位程序。

#include <stdio.h>
#include <conio.h>

void displayBits( unsigned value );
void reverseBits( unsigned value, unsigned c );

int main( void )
{
    unsigned value;
    unsigned c = 32;

    printf( "Enter a unsigned integer: " );
    scanf( "%u", &value );   

    displayBits( value );
    printf( "%10s", "Reversed:    " );
    reverseBits( value , c );

    getche();
    return 0;
}

void displayBits( unsigned value )
{
     unsigned c;
     unsigned mask = 1 << 31;

     printf( "%10u = ", value );

     for( c = 1; c <= 32; c++ ){
          putchar( value & mask ? '1' : '0' );
          value <<= 1;
          if( c % 8 == 0 )
              putchar( ' ' );

          }//end for    
     putchar( '\n' );

}

void reverseBits( unsigned value, unsigned c )
{
     unsigned mask = 1 << 31;

     if( c == 0 ){
         return;

         }//end if

     else{     
          value <<= 1;
          reverseBits( value , c - 1 );
          putchar( value & mask ? '1' : '0' );
          if( c % 8 == 0 ){
              putchar( ' ' );

              }//end if
          }//end else
}

当我输入 15 它输出

01111000 00000000 00000000 00000000

而不是

11110000 00000000 00000000 000000000. 
 else{     
      value <<= 1;//<-- Value has been changed before it can be used
      reverseBits( value , c - 1 );
      putchar( value & mask ? '1' : '0' );
      if( c % 8 == 0 ){
          putchar( ' ' );

          }//end if
      }//end else

替换为

else {
    reverseBits(value << 1, c - 1 );
    putchar( value & mask ? '1' : '0' );
    if( c % 8 == 0 ){
        putchar( ' ' );
    }
}

如果您尝试使用当前代码来设置所有位的数字,那么您就会知道自己的错误。如果设置了所有位,您的程序将 return 跟随 o/p。

01111111 11111111 11111111 11111111
instead of
11111111 11111111 11111111 11111111

那是因为你将给定数字的第一位移动了 32 次(位置),而不是 31 次。所以你必须改变你的逻辑。您可以按照@BLUEPIXY 指出的那样进行操作。