我试图将二进制转换为十进制

时间:2014-09-30 14:16:05

标签: c

好吧......逻辑是..我传递一个具有二进制数的整数变量...说(11010101),其中小数是213 ....

该函数将找到二进制数的位数,即8。然后它将运行多次循环..然后,如果该二进制数的第k位为1,那么它将添加2 ^ k如果二进制数的第k个数字为0,则为ans变量...我只是跳过它......

所以1 = 128 1 = 64 0 = 0 1 = 16 0 = 0 1 = 4 0 = 0 1 = 1       ------        213       ------

这就是逻辑......但是当我运行它时......我一直得到答案 0 ...你们可以帮帮我吗?

所以这是代码..

int toDecimal(int number,int base){
    if (base==2) {
        int i, n=number, dec=0, d1, d=0;

        while(n!=0){
            n=n/10;
            ++d;
        }
        d1=d;

        for(i=0;i<d;i++){
            if(n%10==1){
                dec+=pow(2,--d1);
                n=n/10;
            }
            else{
                --d1;
                n=n/10;
            }
        }
        return dec;
    }
    return 0;
}

4 个答案:

答案 0 :(得分:2)

for(i = 0; number != 0; i++){
    if(number % 10 == 1){
        dec += 1<<i;
    }
    number /= 10;
}

这应解决评论中讨论的所有问题。

答案 1 :(得分:1)

您在第一个while循环中使用以下语句永久修改n:n=n/10;您需要在使用n=number;的循环之间将n设置为数字

答案 2 :(得分:1)

这是一个有用的提示:

  • 171的二进制表示形式为: 0b10101011
  • 213的二进制表示为: 0b11010101

请注意,它们具有相同的表示形式,但它们是相反的。

话虽如此,因为你计算解决方案中的小数位和其他所有内容,它变得相当复杂。它不需要那么复杂。

#include <stdio.h>
#include <assert.h>

int toDecimal(int number, int base) {
    assert(base == 2);
    int result = 0;
    int offset = 1;

    while (number) {
        if (number % 10 == 1)
            result += offset;
        offset *= 2;
        number /= 10;
    }

    return result;
}

int main() {
    printf("%d\n", toDecimal(11010101, 2));
}

答案 3 :(得分:0)

不使用两个循环,而只使用一个循环,如下面给出的

你甚至可以删除if语句。

int toDecimal(int number,int base){
    if (base==2) {
        int n=number, dec=0, d=0, r;

        while(n!=0){
            r=n%10;
            dec+=r*1<<d++;
            n=n/10;
        }
        return dec;
    }
    return 0;
}