二進位制在電腦科學中是很重要的,因為儲存在計算機內的所有值都是以 0 和 1 儲存的。如果沒有能力在二進位制數和普通字串之間轉換,我們與計算機之間的互動非常棘手。
整數值是常見的資料項。他們一直用於電腦程式和計算。我們在數學課上學習它們,當然最後用十進位制或者基數 10 來表示它們。十進位制 233^10 以及對應的二進位制表示 11101001^2 分別解釋為:
但是我們如何能夠容易地將整數值轉換為二進位制呢?答案是 「除 2」演算法,它用棧來跟蹤二進位制結果的數字。
「除 2」 演算法假定我們從大於 0 的整數開始。不斷迭代的將十進位制除以 2,並跟蹤餘數。第乙個除以 2 的餘數說明了這個值是偶數還是奇數。偶數有 0 的餘數,記為 0。奇數有餘數 1,記為 1.我們將得到的二進位制構建為數字序列,第乙個餘數實際上是序列中的最後乙個數字。見 figure 5 , 我們再次看到了反轉的屬性,表示棧可能是解決這個問題的資料結構。
實現**如下:
from pythonds.basic.stack import stack
defdivideby2
(decnumber):
remstack = stack()
while decnumber > 0:
rem = decnumber % 2
remstack.push(rem)
decnumber = decnumber // 2
binstring = ""
while
not remstack.isempty():
binstring = binstring + str(remstack.pop())
return binstring
這個用於二進位制轉換的演算法可以很容易的擴充套件以執行任何基數的轉換。在電腦科學中,通常會使用很多不同的編碼。其中最常見的是二級制,八進位制和十六進製制。
十進位制 233 和它對應的八進位制和十六進製制 351^8, e9^16
可以修改 divideby2 函式,使它不僅能接受十進位制引數,還能接受預期轉換的基數。『除 2』 的概念被簡單的替換成更通用的 『除基數』。在 activecode2 展示的是乙個名為 baseconverter 函式。採用十進位制數和 2 到 16 之間的任何基數作為引數。餘數部分仍然入棧,直到被轉換的值為 0。我們建立一組數字,用來表示超過 9 的餘數。實現**如下:
from pythonds.basic.stack import stack
defbaseconverter
(decnumber,base):
digits = "0123456789abcdef"
remstack = stack()
while decnumber > 0:
rem = decnumber % base
remstack.push(rem)
decnumber = decnumber // base
newstring = ""
while
not remstack.isempty():
newstring = newstring + digits[remstack.pop()]
return newstring
參考資料:《problem-solving-with-algorithms-and-data-structure-using-python》 鏈式表示的棧 鏈式棧2 進製轉換
利用鍊錶模擬棧實現十進位制數2015轉換為對應的八進位制數。分析 一般情況下,把十進位制轉換為八進位制 二進位制等可以使用輾轉相除法,例如將十進位制數2015轉換為八進位制數的過程如圖。轉換後的八進位制數為 3737 在圖中,被除數除以8得到商數,記下餘數,又將商數作為新的被除數繼續除以8,直到商為...
java 進製轉換 例項
import com.biiway.gmrc.protocol.util.stringutil import com.biiway.gmrc.protocol.util.tostringutil 二進位制字串和位元組陣列的轉換工具類 public class binarytransformer in...
棧 任意進製轉換
本題易錯的地方為對n的值的判斷,分為三種情況 第一種為n大於零,這時可直接進行進製轉換運算 第二種為n等於零,此時無論n轉換成幾進製,輸出都為0 第三種為n小於零,此時可以先把n的值大於零,賦給另一變數,到下面再判斷n是否大於零,若大於零則輸出 還有一難點為當轉換為十一到十六進製制是的字母,這一點在...