《程式設計師的數學課》模組一 無處不在的數學思維01

2022-01-30 12:43:29 字數 3752 閱讀 3882

數制是一種計算數量大小的制度,也是計數法。用大白話來說,就是數數的方法

數制中,最重要的因素是基數。假設我們設定基數為 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」構成,**如下:

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')

我們還可以利用位運算的「與」,來判斷二進位制數字 x 的形式是否為乙個「1」和若干個「0」。判斷的方法是,計算 x & (x-1),如果結果為 0 則是,如果結果為 1 則不是。位運算涉及哪些知識?

這樣我們可以得到更簡單的實現**,**如下:

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...

《程式設計師的數學》思考題(一)

豆瓣 程式設計師的數學 程式設計師的數學 這本書,除了前兩章介紹數學的基本概念外,其它章節主要通過思考題的方式,在解答過程中給我們講解數學知識和思維方式。所以看完整本書後,通過對思考題的不斷訓練 可以使我們串起書中的知識點,鞏固知識。為了便於日後的複習,這裡整理了書中絕大多數的思考題,內容舒適,請放...