第一章:二進(jìn)制
1、什么是二進(jìn)制計(jì)數(shù)法假消?
理解二進(jìn)制之前,先理解十進(jìn)制富拗。十進(jìn)制的基數(shù)是10臼予,例如:2871 = 210^3 + 810^2 + 710^1 + 1100啃沪,可以看到十進(jìn)制的數(shù)位全部都是10n的形式。
明白了十進(jìn)制创千,同理二進(jìn)制的基數(shù)就是2,二進(jìn)制的數(shù)位就是2^n的形式追驴,例如110101為二進(jìn)制,表示為十進(jìn)制:
按照這個(gè)思路殿雪,我們可以推導(dǎo)出八進(jìn)制、十六進(jìn)制等丙曙。
基于此,我們來看看二進(jìn)制扯旷、十進(jìn)制、八進(jìn)制和十六進(jìn)制在python中是如何互相轉(zhuǎn)換的钧忽,并驗(yàn)證我們之前的推斷。
2逼肯、二進(jìn)制的位操作
常見的二進(jìn)制位操作包括向左移位和向右移位操作耸黑,以及“或” “與” “異或” 的邏輯操作。下面我們一一來看汉矿。
向左移位
二進(jìn)制 110101 向左移一位崎坊,就是在末尾添加一位 0,因此 110101 就變成了 1101010奈揍。請(qǐng)注意赋续,這里討論的是數(shù)字沒有溢出的情況男翰。
所謂數(shù)字溢出纽乱,就是二進(jìn)制數(shù)的位數(shù)超過了系統(tǒng)所指定的位數(shù)冒版,目前主流的系統(tǒng)都支持至少32位的整型數(shù)字。如果進(jìn)行左移操作的二進(jìn)制已經(jīng)超出了32位,左移后數(shù)字就會(huì)溢出明郭,需要將溢出的位數(shù)去除栏尚。
在這個(gè)例子中吮便,如果將1101010換算為十進(jìn)制镜粤,int(0b1101010)捏题,就是106肉渴,正好是53的二倍。 所以循狰,我們可以得出一個(gè)結(jié)論:二進(jìn)制左移一位,其實(shí)就是將數(shù)字翻倍晤揣。
向右移位
二進(jìn)制 110101 向右移一位朱灿,就是去除末尾的那一位钠四,因此110101就變成了11010盗扒。我們將11010換算為十進(jìn)制缀去,int(0b11010) 等于 26。正好是53除以2的整數(shù)商褥影,所以二進(jìn)制右移一位咏雌,就是將數(shù)字除以2的整數(shù)商凡怎。
接下來我們看看代碼中如何進(jìn)行移位操作:
對(duì)10進(jìn)行左移2位统倒,5進(jìn)行右移2位氛雪,結(jié)果:
位的“或”
num1 = 0b110101
num2 = 0b100011
print(bin(num1 | num2))
// output: 0b110111
位的“與”
num1 = 0b110101
num2 = 0b100011
print(bin(num1 & num2))
// output: 0b100001
位的“異或”
num1 = 0b110101
num2 = 0b100011
print(bin(num1 ^ num2))
// output: 0b10110
總結(jié)
- 什么是二進(jìn)制?
十進(jìn)制使用 10 作為基數(shù)浴鸿,x 進(jìn)制使用 x 作為基數(shù), x 進(jìn)制的數(shù)位>就是 x^n 的形式- 計(jì)算機(jī)為什么使用二進(jìn)制?
二進(jìn)制的數(shù)據(jù)表達(dá)具有抗干擾能力強(qiáng)毙沾、可靠性高的優(yōu)點(diǎn);二進(jìn)制非常適>合邏輯運(yùn)算- 二進(jìn)制的位操作
二進(jìn)制左移一位左胞,就是將數(shù)字翻倍举户。二進(jìn)制右移一位,就是將數(shù)字除以2并求整數(shù)商俭嘁。
![]()
- 或:參與操作的位中,只要有一個(gè)是1供填,最終結(jié)果就是1
- 與:參與操作的位中,必須全都是1叉瘩,最終結(jié)果才是1
- 異或:參與操作的位相同粘捎,最終結(jié)果就為0薇缅,否則為1
第二章:余數(shù)
- 余數(shù)的特性:整數(shù)是沒有邊界的攒磨,它可能是正無窮,也可能是負(fù)無窮娩缰。余數(shù)卻總是在一個(gè)固定的范圍內(nèi)。生活中浮毯,余數(shù)可以用來算星期演痒,web編程中可以用在分頁中
- 同余定理:兩個(gè)整數(shù) a 和 b亲轨,如果它們除以正整數(shù) m 得到的余數(shù)相等鸟顺,我們就可以說 a 和 b 對(duì)于模 m 同余
- 哈希(Hash):每個(gè)編程語言都有對(duì)應(yīng)的哈希函數(shù)器虾。哈希有的時(shí)候也被翻譯為散列蹦锋,簡單來說就是將任意長度的輸入,通過哈希算法壓縮為某一固定長度的輸入
第三章:迭代法
......