2014-09-30 6 views
-2

ok ... логика ... Я передаю целочисленную переменную, имеющую двоичное число ... скажем, (11010101), которое равно 213 в десятичном разряде ....Я пытаюсь преобразовать двоичный код в десятичный

функция найдет число цифр двоичного числа, которое равно 8. Затем он будет запускать цикл, который много раз .. тогда, если k-я цифра этого двоичного числа равна 1, тогда она добавит 2^k к переменной ans, если k-я цифра двоичного числа равна 0 ... Я просто пропущу его.

так 1 = 128 1 = 64 0 = 0 1 = 16 0 = 0 1 = 4 0 = 0 1 = 1 - ----- ------

Thats логика .... но когда я запускаю его ... Я продолжаю получать ответ как 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; 
} 
+1

Общая рекомендация: Более длинные имена переменных не стоят дороже. Намного легче понять, что говорит 'number_of_digits', чем понимать, что означает' d'. –

+0

вам нужно сбросить 'n' после нахождения числа цифр. – mch

+0

@sharath gr8 ... точка взята .. спасибо за подсказку :) .... так и нашел, почему я продолжаю получать 0 ?? –

ответ

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

это должно решить все проблемы, обсуждаемые в комментариях.

1

Вы постоянно модифицируя п в вашей очень первом в то время как петле с этим утверждением: n=n/10; Вам нужно установить п обратно число между петлями с n=number;

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)); 
} 
0

Вместо того, чтобы использовать два цикла в использовании только один цикл, как приведено ниже

, и вы можете даже устранить, если заявление.

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; 
}