數制是一種計算數量大小的制度,也是計數法。用大白話來說,就是數數的方法。
數制中,最重要的因素是基數。假設我們設定基數為 10 來數數,那就是在用十進位制計數法;如果設定基數為 2,就是在用二進位制計數法。經常說的進製,其實就是數制
不同的數制中,使用最廣泛的就是十進位制,這與人類有 10 個手指頭是密不可分的。人類在學習計數和四則運算時,會通過手指頭輔助計算。
有了不同的數制,就需要對數制下的數字進行區分,否則就會造成混淆。例如,象徵考試得了滿分的 100,在十進位制下依舊是 100;而在二進位制下,它就是十進位制下的 4。0b100=4;在八進位制,則表示十進位制下的 640o100=64;在十六進製制,則表示十進位制下的 256。0x100=256
至於為什麼如此計算轉換,下文的數制轉換方法會詳細講解。
所以如果對數字不加以說明,你會發現很難判斷這到底是哪個數制下的數字,畢竟同一數字在不同數制下其意義是完全不同的。為了避免混淆,我們對不同數制下的數字做了區分。
十進位制使用的數字符號是 [0,1,2,3,4,5,6,7,8,9];對於二進位制和八進位制,它們仍然沿用十進位制的數字符號。在十六進製制中,由於數字符號不夠用,這就需要額外補充。一般用 [a,b,c,d,e,f](一般不會特別區分字母的大小寫),分別代表十進位制下的 [10,11,12,13,14,15]。
一般而言,沒有額外說明的數字都是十進位制下的數字;
表示二進位制時,會用 0b 作為數字的字首;
表示八進位制時,會用 0o 或者 0 作為數字的字首;
表示十六進製制時,會用 0x 作為數字的字首。
這裡 b、o、x 三個英文本母的選擇均來自數制的英文單詞。
綜上,我們對這幾個數制的資訊整理如下表:
人們在使用數制進行計算時,都習慣性地把原問題對映到十進位制中;計算完成後,再對映回去。這裡就牽涉數制的轉換啦。就是因為人類習慣10進製,所以才要轉換
我舉乙個生活中最常見的數制轉換的例子。
例如,上午 8:40 開始考試,考試時長是 40 分鐘,問考試結束的時間是多少?
計算過程是:考試時長的40 分鐘加上 8 點過 40 分的40 分鐘就是 80 分鐘,也即是 1 小時 20 分鐘,再加上 8 點本身,結束時間就是上午 9:20。
「40分鐘+40分鐘=80分鐘」就是十進位制的算術過程,可見為了完成其他數制的運算,我們依舊更喜歡用十進位製做橋梁,畢竟我們對十進位制的運算是最熟悉的。
對於任意乙個基數 n 進製下的數字 x,它轉換為十進位制的方法。如下圖的公式所示:原進製若是 n 進製,轉換時的基數便取 n。例如,將二進位制的 x 轉化為十進位制時,運算時的轉換基數便取為 2。
轉向的目標進製為 n 進製,則以 n 為除數不斷地做除法,將最後的商和之前的餘數逆序串聯在一起,就是最終的結果。
例如,十進位制的 19 轉換為二進位制的過程如下圖所示:
對於八進位制和二進位制之間的轉換,你可以利用十進位製做個跳板。
除此之外,還有乙個簡單的按位拆分法,可以將八進位制轉為二進位制。
你只需要把原來八進位制中的每個數字符號,直接拆分為3 位的二進位制數字符號(必須保證是 3 位),再按順序串聯起來,就是最終結果。
我們以八進位制下的 023 為例進行講解:
則八進位制的 023 的二進位制表示就是 0b10011,如下圖
同理:為何八進位制與二進位制的轉換是按照 3 位數合併、拆分,而十六進製制與二進位制之間則是 4 位數呢?本質原因是在於 2³=8 和 2⁴=16。根據這表示式可以看出,二進位制中的 3 個 bit(位),恰好可以表示 0~7 這 8 個數字。因此,按照 3 位合併,就可以從二進位制轉化到八進位制了。同理,按照 4 位合併,就可以從二進位制轉化到十六進製制了。而八進位制與十六進製制之間的轉換,就不適用按位合併和按位拆分的方法了,你可以以二進位制或十進位制為跳板,進行兩者之間的轉換。
只要把這個圖畫出來,就能轉換進製了
【例題】判斷乙個整數 a,是否是 2 的整數次冪。
解析:如果是十進位制,判斷乙個數是否是 10 的整數次冪,只需要看這個數字的形式是否為乙個「1」和若干個「0」構成。例如,乙個「1」和兩個「0」構成「100」,它是 10 的 2 次冪;乙個「1」和 4 個「0」構成「10000」,它是 10 的 4 次冪。
因此這個題目的解法就是,把 a 轉換為二進位制,看看 bin(a) 的形式是否為乙個「1」和若干個「0」構成,**如下:
我們還可以利用位運算的「與」,來判斷二進位制數字 x 的形式是否為乙個「1」和若干個「0」。判斷的方法是,計算 x & (x-1),如果結果為 0 則是,如果結果為 1 則不是。位運算涉及哪些知識?a = 8
b = str(bin(a))
total = 0
for i in range(2,len(b)):
total += int(b[i])
if total == 1 and b[2] == '1':
print('yes')
else:
print('no')
這樣我們可以得到更簡單的實現**,**如下:
數制是數字的基礎,也是計算機的基礎。資訊時代的到來,讓二進位制被廣泛應用,這主要是因為電路中的開關只有接通和切斷兩種狀態,二進位制的運算也稱為位運算。a = 80
if a & (a-1) == 0:
print('yes')
else:
print('no')
計算機的資料儲存單位便體現了數制的應用,計算機中的資料儲存單位常常用 byte(位元組)或 bit(位)。
bit 是表示資訊的最小單位,叫作二進位制位,乙個 bit 等於乙個二進位制數。乙個十進位制的數的位元要換成二進位製看,比如十進位制 31 換二進位制是 11111 是 5 個 bit,32 換二進位制是 100000 是 6 個 bit。而** byte 叫作位元組,用於表示計算機中的乙個字元,是計算機檔案大小的基本計算單位,1 byte = 8 bit(也寫作 1b = 8b),它採用了 8 個 2 進製位。**
在本課時中,我們學習不同數制之間的轉換方法,包括換基法、除餘法、按位拆分法和按位合併法。其中的換基法和除餘法,是關於十進位制的轉換;而按位拆分法和按位合併法,則是關於二進位制的轉換。
在學習過程中,你會發現八進位制和十六進製制採用的按位合併法,更像是對二進位制的壓縮表示。八進位制或十六進製制的乙個位,可以表示出 3 或 4 位的二進位制數字。因此,用八進位制或十六進製制來表示二進位制會更為方便。這是不是就是壓縮和解壓的基礎原理?如果不是,那壓縮的原理是啥?為什麼壓縮分那麼多的格式呢?
程式設計師的數學基礎課 筆記4
你好,我是黃申。今天我們來聊聊 餘數 提起來餘數,我想你肯定不陌生,因為我們生活中就有很多很多與餘數相關的例子。比如說,今天是星期三,你想知道 50 天之後是星期幾,那你可以這樣算,拿 50 除以 7 因為乙個星期有 7 天 然後餘 1,最後在今天的基礎上加一天,這樣你就能知道 50 天之後是星期四...
程式設計師的數學一(1 4章)
遺漏 與 重複 其中有真值表,文氏圖,邏輯表示式,卡諾圖 卡諾圖是將所有命題的真假組合以二維陣列的形式表示出來的圖。1.今天星期日,那麼10 100天後是星期幾 由於10 100太大,7的話計算起來相當費勁,所以得找個規律。1天以後的星期數為一 10天以後的星期數字三 100天以後的星期數為二 10...
《程式設計師的數學》思考題(一)
豆瓣 程式設計師的數學 程式設計師的數學 這本書,除了前兩章介紹數學的基本概念外,其它章節主要通過思考題的方式,在解答過程中給我們講解數學知識和思維方式。所以看完整本書後,通過對思考題的不斷訓練 可以使我們串起書中的知識點,鞏固知識。為了便於日後的複習,這裡整理了書中絕大多數的思考題,內容舒適,請放...