如何将二进制转换为十进制?

时间:2016-09-10 05:07:55

标签: c

我今天快速编写(在查找各种谷歌搜索的帮助下)进行基本分配,将二进制转换为十进制。这只是将签名转换为2的补码的部分。

void binary_to_decimal (char *value){
    int i;
    int numdigits = strlen(value);
    int c=0;
    char nvalue[numdigits];
    char sum[numdigits];
    char b[numdigits];

    for(i=0;i<numdigits;i++)    
        b[i]='0';

    b[numdigits-1]='1';

    if (numdigits%4==0 && value[0]=='1')    {
        for(i=0;i<numdigits;i++){
            if(value[i]=='1')
                 nvalue[i]='0';
            else if(value[i]=='0')
                nvalue[i]='1';
    }

    for(i=0;i<numdigits;i++)
        printf("%c", nvalue[i]);

    printf("\n");

    for(i=0;i<numdigits;i++)
        printf("%c", b[i]);

    printf("\n");

    for(i=numdigits-1; i>=0; i--){
        nvalue[i]=nvalue[i]-'0';
        b[i]=b[i]-'0';
        sum[i]=(nvalue[i]^b[i]^c)+'0';
        c=(nvalue[i]&b[i]) | (b[i]&c) | (nvalue[i]&c);
    }

    if (c!=0)
        sum[0]=1;

    for(i=0;i<numdigits;i++)
        printf("%c", sum[i]);
    }
    else {

    }

    printf("\n");
}

显然我可以清理它,但这不是我担心的。 这看起来很有效,但我觉得它有所不同,可以让它起作用并理解让它发挥作用的每一个细节。

我很感激有关此问题的任何反馈。事情会赶上我吗?

我将重新审视代码并尝试理解它,但任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

让我们从这个代码 not convert binary to decimal开始。也许这就是你的意思:

  

这只是将签名转换为2补码的部分。

这段代码(尝试)做的是否定二进制字符串表示的值。像:

a = -a;
    ^
    Negate

基本原则是:

1)反转原始二进制字符串中的每一位

2)在第一步的结果中加1。

4位二进制的示例:

           0111 (is 7 )

1) Invert: 1000 (is -8)

2) Add 1:  1001 (is -7)

因此,您的第一个循环执行反转,第二个循环添加1

但是,您的代码不正确。如果numdigits%4==0 && value[0]=='1'为false,则永远不会初始化nvalue,并且您的代码具有未定义的行为(在第二个循环中)。我无法弄清楚你使用if语句的原因。它不应该存在。你应该总是执行第一个循环。

此外 - 这些线条似乎很奇怪:

}
else {

}

他们不符合任何开场陈述。

在您的代码中,您使用'0''1'执行所有计算,而不是仅使用01。因此,你经常需要在它们之间进行转换,即

`0` - `0` to convert to a real 0
`1` - `0` to convert to a real 1

0 + `0` to convert to a `0` (i.e. a printable 0)
1 + `0` to convert to a `1` (i.e. a printable 1)

使您的代码比需要的复杂得多。

相反,您可以将内容保持为真实01 - 除非在打印时:

// This function negates a binary string by
//    a) Inverting each bit
//    b) Adding 1 to the inverted string
void negate_binary (char *value){
    int i;
    int numdigits = strlen(value);
    int c=0;
    char nvalue[numdigits];
    char sum[numdigits];
    char b[numdigits];

    // Set b to 1, i.e. 00000...0001
    for(i=0;i<numdigits;i++)    
        b[i]=0;
    b[numdigits-1]=1;

    // Invert all bits in the input string
    for(i=0;i<numdigits;i++){
        if(value[i]=='1')
             nvalue[i]=0;
         else if(value[i]=='0')
            nvalue[i]=1;
         else
             exit(1);  // Illegal input

    for(i=0;i<numdigits;i++)
        printf("%c", nvalue[i] + '0');

    printf("\n");

    for(i=0;i<numdigits;i++)
        printf("%c", b[i] + '0');

    printf("\n");

    // Do sum = nvalue + b (i.e. sum = nvalue + 1)
    for(i=numdigits-1; i>=0; i--){
        sum[i]=(nvalue[i]^b[i]^c);                     // Add with carry
        c=(nvalue[i]&b[i]) | (b[i]&c) | (nvalue[i]&c); // Calculate new carry
    }

    if (c!=0)
        sum[0]=1;

    for(i=0;i<numdigits;i++)
        printf("%c", sum[i] + '0');
    }
    else {

    }

    printf("\n");
}