2014-09-30 30 views
-2

好的...邏輯是..我傳遞一個整數變量具有二進制數...說(11010101)這是十進制213 ...我試圖將二進制轉換爲十進制

該函數將找到二進制數字的位數爲8,然後它將運行多次的循環。然後如果該二進制數字的第k個數字是1,那麼它會將2^k加到變量if二進制數的第k位是0 ...我只是略過它...

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

多數民衆贊成在邏輯....但wheni運行它...我一直得到的答案爲 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'表示的內容要容易得多。 – 2014-09-30 14:18:49

+0

您必須在找到數字位數後重置'n'。 – mch 2014-09-30 14:20:42

+0

@sharath gr8 ...點採..謝謝你的提示:) ....所以你找到爲什麼我一直得到0? – 2014-09-30 14:21:08

回答

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

這應該解決的意見討論的所有問題。

1

你永久在你的這個說法最早while循環修改N:n=n/10;您需要在環路之間,n=number;

設置N回數
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

而是使用兩個循環中只使用一個循環等給出如下

,你甚至可以消除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; 
}