使用c找到给定数字的二进制的反转

时间:2016-01-10 09:30:03

标签: c

编辑:

我正在尝试创建一个接受数字的程序,显示其二进制数并显示该二进制文件的反向。但我不知道如何以一种好的方式或以任何方式做到这一点〜所以我可以得到帮助 这是我的代码:

    /*
 * C Program to Convert a Number Decimal System to Binary System using Recursion
 */
#include <stdio.h>

int convert(int);

int main()
{
    int dec, bin,reverse_bin,i;

    printf("Enter a decimal number: ");
    scanf("%d", &dec);
    bin = convert(dec);
    printf("The binary equivalent of %d is %d.\n", dec, bin);
    for (i = 1; i < 9; i++)
    {
         reverse_bin =  bin << 1;

    }

         printf("The reverse binary of 10 is = %d \n",reverse_bin);
    return 0;
}

int convert(int dec)
{
    if (dec == 0)
    {
        return 0;
    }
    else
    {
        return (dec % 2 + 10 * convert(dec / 2));

    }
}

2 个答案:

答案 0 :(得分:0)

您的convert()函数返回一个整数,当以十进制形式显示时,只包含1和0位数;这是一种转变,而不是转化。这是一个坏主意,数学上存在缺陷,当int需要32时,仅限于9位数。

事实上,int已经是二进制的,并且将其位直接转换为字符串(正向或反向)更简单,并且更有意义:

#include <stdio.h>
#include <limits.h>

#define INT_BITS (sizeof(int) * CHAR_BIT)
char* binary( char* buffer, int i ) ;
char* binary_reverse( char* buffer, int i ) ;


int main()
{
    int dec ;
    char binary_str[INT_BITS + 1] ;

    printf("Enter a decimal number: ");
    scanf("%d", &dec);

    printf("The binary of %d is %s.\n", dec, binary( binary_str, dec) ) ;
    printf("The reverse binary of %d is %s.\n", dec, binary_reverse( binary_str, dec) );

    return 0;
}

char* binary( char* buffer, int i )
{
    int b = 0;
    for( b = 0; b < INT_BITS; b++ )
    {
        unsigned mask = 1u << (INT_BITS - b - 1) ;
        buffer[b] = (i & mask) == 0 ? '0' : '1' ; 
    }
    buffer[b] = '\0' ;

    return buffer ;
}

char* binary_reverse( char* buffer, int i )
{
    int b = 0;
    for( b = 0; b < INT_BITS; b++ )
    {
        unsigned mask = 1u << b ;
        buffer[b] = (i & mask) == 0 ? '0' : '1' ; 
    }
    buffer[b] = '\0' ;

    return buffer ;
}

请注意,binary()binary_reverse()之间的唯一区别是mask的计算。

答案 1 :(得分:-1)

让您的问题变得困难的原因在于它可能取决于您计算机的字长。简单地说,0001反转为1000或10000000或100000000000000000000000000000?好吧,让我们说它反转为1. :)

如果您同意,那么以下内容应该有效:

int rb(int dec) {
  int ret=0;
  while (dec) {
     if (dec & 1) {
        ret<<=1;
        ret |=1;
        }
     else {
        ret<<=1;
        }
     dec>>=1;
     }
  return ret;
}

哦,是否有目标以递归方式进行?