2009-11-01 177 views
2

這可能是一個非常奇特的問題。將十進制數位數組轉換爲二進制數位數組

我的問題如下:

的TI 83+圖形計算器,您可以使用任一組件和連接電纜到計算機或內置的TI-BASIC編程語言,它編程。

根據我發現,它只支持16位整數和一些模擬浮點數。

我想與然而稍大數(約64位)的工作,所以,我使用與單位數的數組:

{1, 2, 3, 4, 5} 

將是十進制12345

在二進制,即110000 00111001或二進制數組:

{1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1} 

這將是計算器如何顯示它。

我該如何去轉換這個十進制數字的數組(它對於計算器來說太大了以顯示它作爲本地類型)轉換爲十進制數字的數組?

效率不是問題。這不是功課。

這會讓我自由地爲這樣的數組等實現Addition。

謝謝!

回答

1

想過這個問題,我想我會用下面的「算法」

  • 檢查(在本例中爲5)最後一位
  • 如果是奇數,店做(從二進制陣列

  • 以相反的順序)1現在通過2通過下面的方法把數:

  • 開始與第一個數字和清除「攜帶」變量。
  • 將它除以2並添加'carry'變量。如果餘數爲1(檢查這個你做的和& 1分之前)然後把5進
  • 重複,直到所有數字再次被兩個步驟完成

重複,直到整個號碼是減少到0。

在您的二進制數組數爲二進制表示

你的例子: 1,2,3,4,5

  • 5是奇數,所以我們存儲1二進制陣列中:
  • 0,2,3,4,5 => 0,1 + 5,3,4,5 => 0,6,1,4,5:1
  • 我們使用算法除以2陣列=> 0,6,1,2 + 5,5 => 0,6,1,7,2

並重復:

0,6,1,7,2最後一位是偶數,所以我們存儲0:0,1(通知我們填補右二進制串至左)

你最終有一個二進制

編輯: 不僅僅是上文澄清:我做的是古老的算法:

int value=12345; 
while(value>0) 
{ 
     binaryArray.push(value&1); 
     value>>=1;  //divide by 2 
} 

除了你的例子中,我們沒有一個int,而是一個表示一個(10個鹼基)int的數組; ^)

+0

優秀,這是有效的。儘管開始時我使用了二分法算法:首先從第一個數字開始(並且在右側工作),並且每次您輸入的數字都是奇數時,您會攜帶一個5來添加除法結果下一個數字。 – wsd 2009-11-09 20:16:59

+0

酷! 5實際上來自數字爲10的基數。基數10除以2爲5.使用二進制除法,您將在進位中添加1(基數2除以2); ^) – Toad 2009-11-10 08:03:47

0

這裏的主要問題是你要在不相互重合的基礎之間,因此在輸入數字和輸出數字之間沒有直接的孤立映射。你可能打算要開始與你最顯著位,輸出儘可能多的產出至少顯著的數字,你可以,你需要諮詢下一個數字之前,等等。這樣,您只需要在任何給定的時間點最多檢查2個輸入數字。

您可能會發現它的處理順序存儲在逆轉形式的數字而言是有利的(使得至少顯著數字來首次在陣列中)。

+0

但是,第二個二進制數字可以影響以前的數字:例如數字17:最後一位數字轉換爲二進制數字0111,並轉移到十進制數字10(需要存儲...)它表示並在0111中添加0111需要二進制加法,現在想象做99次二進制數字二進制加法30次(30個十進制數字<= 99個二進制數字) – wsd 2009-11-09 20:22:11

0

在途中,將十進制表示中的每個數字轉換爲它的二進制表示,然後添加的所有的數字二進制表示:

5 = 101 
40 = 101000 
300 = 100101100 
2000 = 11111010000 
10000 = 10011100010000 

      101 
      101000 
     100101100 
    11111010000 
+ 10011100010000 
---------------- 
    11000000111001 

在C#概念的證明:

方法轉換爲二進制數字的陣列,加入陣列和乘法陣列由10:

private static byte[] GetBinary(int value) { 
    int bit = 1, len = 1; 
    while (bit * 2 < value) { 
    bit <<= 1; 
    len++; 
    } 
    byte[] result = new byte[len]; 
    for (int i = 0; value > 0;i++) { 
    if (value >= bit) { 
     value -= bit; 
     result[i] = 1; 
    } 
    bit >>= 1; 
    } 
    return result; 
} 

private static byte[] Add(byte[] a, byte[] b) { 
    byte[] result = new byte[Math.Max(a.Length, b.Length) + 1]; 
    int carry = 0; 
    for (int i = 1; i <= result.Length; i++) { 
    if (i <= a.Length) carry += a[a.Length - i]; 
    if (i <= b.Length) carry += b[b.Length - i]; 
    result[result.Length - i] = (byte)(carry & 1); 
    carry >>= 1; 
    } 
    if (result[0] == 0) { 
    byte[] shorter = new byte[result.Length - 1]; 
    Array.Copy(result, 1, shorter, 0, shorter.Length); 
    result = shorter; 
    } 
    return result; 
} 

private static byte[] Mul2(byte[] a, int exp) { 
    byte[] result = new byte[a.Length + exp]; 
    Array.Copy(a, result, a.Length); 
    return result; 
} 

private static byte[] Mul10(byte[] a, int exp) { 
    for (int i = 0; i < exp; i++) { 
    a = Add(Mul2(a, 3), Mul2(a, 1)); 
    } 
    return a; 
} 

轉換的數組:

byte[] digits = { 1, 2, 3, 4, 5 }; 

byte[][] bin = new byte[digits.Length][]; 
int exp = 0; 
for (int i = digits.Length - 1; i >= 0; i--) { 
    bin[i] = Mul10(GetBinary(digits[i]), exp); 
    exp++; 
} 
byte[] result = null; 
foreach (byte[] digit in bin) { 
    result = result == null ? digit: Add(result, digit); 
} 

// output array 
Console.WriteLine(
    result.Aggregate(
    new StringBuilder(), 
    (s, n) => s.Append(s.Length == 0 ? "" : ",").Append(n) 
).ToString() 
); 

輸出:

1,1,0,0,0,0,0,0,1,1,1,0,0,1 

編輯:
用於通過幾十相乘的陣列增加的方法。在將數字轉換爲二進制數組之前將數字相乘,必須對數組進行處理。

+0

這並不是'因爲如果數字變得大於int,MUL變量會溢出int。所以轉換:4294967296(0x100000000)將不可能。 – Toad 2009-11-01 13:32:15

+0

如果有的話,你可以馬上將數字加在一起,然後將它們一起考慮,然後將它們一次全部轉換爲二進制,而不是進行二進制加法。再次,這也將被限制在int – Toad 2009-11-01 13:33:04

+0

@reinier的範圍內:是的,我發佈後發現它。我正在發佈更新... – Guffa 2009-11-01 13:36:43

相關問題