簡體   English   中英

如何將表示為數字數組的數字從 base-2^k 轉換為二進制?

[英]How would I convert a number represented as an array of digits from base-2^k to binary?

我有一個算法可以模擬手動將二進制數轉換為十進制數。 我的意思是每個數字都表示為一個數字數組(從最不重要到最重要),而不是使用語言的 int 或 bigint 類型。

例如,base-10 中的 42 將表示為 [2, 4],base-2 中的 10111 將表示為 [1, 1, 1, 0, 1]。

這是在 Python 中。

def double(decimal):
    result = []
    carry = 0
    for i in range(len(decimal)):
        result.append((2 * decimal[i] + carry) % 10)
        carry = floor((2 * decimal[i] + carry) / 10)
    if carry != 0:
        result.append(carry)
    return result

def to_decimal(binary):
    decimal = []
    for i in reversed(range(len(binary))):
        decimal = double(decimal)
        if binary[i]:
            if decimal == []:
                decimal = [1]
            else:
                decimal[0] += 1
    return decimal

這是我幾個學期前在算法課上的作業的一部分,他在筆記中給我們提出了一個挑戰,聲稱我們應該能夠從這個算法中推導出一個可以從基數 2 轉換數字的新算法^k 到二進制。 我今天發現了這個問題,它一直困擾着我(閱讀:讓我感到非常生疏),所以我希望有人能夠解釋我將如何基於此算法編寫to_binary(number, k)函數。

基數2^k有數字0, 1, ..., 2^k - 1

例如,在基數2^4 = 16 ,我們有數字0, 1, 2, ..., 10, 11, 12, 13, 14, 15 為方便起見,我們對較大的數字使用字母: 0, 1, ..., A, B, C, D, E, F

因此,假設您想將AB轉換為二進制。 最簡單的事情是先將其轉換為十進制,因為我們知道如何將十進制轉換為二進制:

AB = B*16^0 + A*16^1 
   = 11*16^0 + 10*16^1
   = 171

如果將171轉換為二進制,您將得到:

10101011

現在,有沒有我們可以使用的快捷方式,所以我們不通過基數 10? 有。

讓我們在這部分停下來:

AB = B*16^0 + A*16^1 
   = 11*16^0 + 10*16^1

回想一下從十進制轉換為二進制需要什么:將整數除以 2,記下余數,最后以相反的順序寫出余數:

number after integer division by 2 | remainder after integer division by 2
--------------------------------------------------------------------------
                                 5 | 1
                                 2 | 0
                                 1 | 1
                                 0 |

                  => 5 = reverse(101) = 101 in binary

讓我們將其應用於這一部分:

11*16^0 + 10*16^1 

首先,對於前4 (因為16^1 = 2^4 )除法,除以2的余數將僅取決於11 ,因為16 % 2 == 0

11 | 1
5  | 1
2  | 0
1  | 1
0  |

所以我們二進制數的最后一部分將是:

1011

到我們完成此操作時,我們將擺脫16^1 ,因為到目前為止我們已經完成了4分區。 所以現在我們只依賴10

10 | 0
 5 | 1
 2 | 0
 1 | 1
 0 |

所以我們的最終結果將是:

10101011

這就是我們用經典方法得到的!

正如我們所注意到的,我們只需要將數字單獨轉換為二進制,因為它們會單獨和順序地影響結果:

A = 10 = 1010
B = 11 = 1011

=> AB in binary = 10101011

對於您的基數2^k ,執行相同的操作:將每個單獨的數字轉換為二進制,從最重要到最不重要,並按順序連接結果。

示例實現:

def to_binary(number, k):
    result = []
    for x in number:
        # convert x to binary
        binary_x = []
        t = x
        while t != 0:
            binary_x.append(t % 2)
            t //= 2
        result.extend(binary_x[::-1])

    return result

#10 and 11 are digits here, so this is like AB.
print(to_binary([10, 11], 2**4))
print(to_binary([101, 51, 89], 2**7))

印刷:

[1, 0, 1, 0, 1, 0, 1, 1]
[1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1]

注意:上面的代碼實際上有一個錯誤。 例如, 2在基座2**7將被轉換到10中的二進制。 但是基數2**7數字應該有7位,因此您需要將其填充到那么多位: 0000010 我將把它留作練習。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM