递归位逆向程序
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 指出的那样进行操作。
递归反向位程序。
#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 指出的那样进行操作。