[英]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.