一荷荤、進(jìn)制
計(jì)算機(jī)在存儲(chǔ)數(shù)據(jù)的時(shí)候都是以二進(jìn)制的形式去存儲(chǔ)的
十進(jìn)制退渗、十六進(jìn)制、八進(jìn)制蕴纳、二進(jìn)制
1氓辣、十進(jìn)制
123、4袱蚓、65、34255765879808
基數(shù):0几蜻、1喇潘、2、3梭稚、4颖低、5、6弧烤、7忱屑、8、9暇昂;
進(jìn)位:逢10進(jìn)1莺戒;
每一位的值:123=1 * 100+2 * 10+3 * 1=1 * 10^2 + 2 * 10^1+ 3 * 10^0
2、二進(jìn)制
所有二進(jìn)制數(shù)都是由0和1組成急波; 1011从铲、1100
基數(shù):0、1澄暮;
進(jìn)位:逢2進(jìn)1名段;
每一位的值: 11011 =1 * 2^4 + 1 * 2^3 + 0 * 2^2 + 1 * 2^1 + 1 * 2^0=27
print(1 * 2 ** 4+1 * 2 ** 3+0 * 2 ** 2+1 * 2 ** 1+1 * 2 ** 0) #27
即(二進(jìn)制)11011=(十進(jìn)制)27
3、八進(jìn)制
基數(shù):0泣懊、1伸辟、2馍刮、3信夫、4、5、6忙迁、7
進(jìn)位:逢8進(jìn)1脐彩;
每一位的值: 3415 =3 * 8^3 + 4 * 8^2 + 1 * 8^1 + 5 * 8^0=1805
print(3 * 8 ** 3 + 4 * 8 ** 2 + 1 * 8 ** 1 + 5 * 8 ** 0) #1805
即(八進(jìn)制)3415=(十進(jìn)制)1805
4、十六進(jìn)制
基數(shù):0姊扔、1惠奸、2、3恰梢、4佛南、5、6嵌言、7嗅回、8、9摧茴、a绵载、b、c苛白、d娃豹、e、f
進(jìn)位:逢16進(jìn)1购裙;
每一位的值: 111 =1 * 16^2 + 1 * 16^1 + 1 * 16^0 = 273
print(1 * 16 ** 2 + 1 * 16 ** 1 + 1 * 16 ** 0) #273
即(十六進(jìn)制)111=(十進(jìn)制)273
5懂版、進(jìn)制之間的轉(zhuǎn)換
a、其他進(jìn)制轉(zhuǎn)換成10進(jìn)制:每一數(shù)位上的數(shù)乘以進(jìn)制的慕次數(shù)躏率,然后求和躯畴;
b、10進(jìn)制轉(zhuǎn)換成其他進(jìn)制:輾轉(zhuǎn)取余法薇芝;
例如 十進(jìn)制轉(zhuǎn)換二進(jìn)制:
即十進(jìn)制的數(shù)字30轉(zhuǎn)換成二進(jìn)制為11110蓬抄;
例如十進(jìn)制轉(zhuǎn)換八進(jìn)制:
即十進(jìn)制的數(shù)字30轉(zhuǎn)換成八進(jìn)制為36;
c夯到、2進(jìn)制轉(zhuǎn)換8進(jìn)制:從右往左取數(shù)倡鲸,每取3位二進(jìn)制轉(zhuǎn)換成1位八進(jìn)制;
例如: 1 111 111=100* (1* 2^0)+ 10* (1* (2^2+ 2^1+ 2^0 ))+1* (2^2 +2^1 +2^0)=177
d黄娘、2進(jìn)制轉(zhuǎn)換16進(jìn)制:從右往左取數(shù)峭状,每取4位二進(jìn)制轉(zhuǎn)換成1位十六進(jìn)制;
例如: 111 1101=0111 1101=
10* (0* 2^3 +1* (2^2 +2^1 +2^0)) +1* (2^3 + 2^2 +2^0)+ 0*2^1=7d逼争;
e优床、8進(jìn)制轉(zhuǎn)換2進(jìn)制:從右往左取數(shù),每取1位八進(jìn)制轉(zhuǎn)換成3位二進(jìn)制誓焦;
f胆敞、16進(jìn)制轉(zhuǎn)換成2進(jìn)制:從右往左取數(shù)着帽,每取1位十六進(jìn)制轉(zhuǎn)換成4位二進(jìn)制;
6移层、Python對進(jìn)制的支持
Python支持通過二進(jìn)制仍翰、八進(jìn)制、十進(jìn)制观话、十六進(jìn)制的形式來直接表示整數(shù)予借;
a、十進(jìn)制:直接寫入的數(shù)字的值都是十進(jìn)制的數(shù)频蛔;
b灵迫、二進(jìn)制:需要在數(shù)字前面加前綴————>0b(零B)
print(0b1111) #15(十進(jìn)制)
c、八進(jìn)制:需要在數(shù)字前面加前綴————>0o(零歐)
print(0o765) #501(十進(jìn)制)
d晦溪、十六進(jìn)制:需要在數(shù)字前面加前綴————>0x(零叉)
print(0xda23) #55843(十進(jìn)制)
e瀑粥、進(jìn)制的轉(zhuǎn)換(結(jié)果是字符串,非數(shù)字)
bin(整數(shù))————>將括號內(nèi)的整數(shù)三圆,轉(zhuǎn)換成二進(jìn)制形式的數(shù)
print(bin(31)) #十進(jìn)制31轉(zhuǎn)二進(jìn)制 11111
print(bin(0o4327)) #八進(jìn)制4327轉(zhuǎn)二進(jìn)制 100011010111
otc(整數(shù))————>將括號內(nèi)的整數(shù)狞换,轉(zhuǎn)換成八進(jìn)制形式的數(shù)
print(oct(31)) #十進(jìn)制31轉(zhuǎn)八進(jìn)制37
print(oct(0o4327)) #八進(jìn)制4327轉(zhuǎn)八進(jìn)制4327
hex(整數(shù))————>將括號內(nèi)的整數(shù),轉(zhuǎn)換成十六進(jìn)制形式的數(shù)
print(hex(31)) #十進(jìn)制31轉(zhuǎn)十六進(jìn)制 1f
print(hex(0o4327)) #八進(jìn)制4327轉(zhuǎn)十六進(jìn)制 x8d7
二舟肉、原碼哀澈、反碼和補(bǔ)碼
計(jì)算機(jī)在存數(shù)字的時(shí)候,存的是數(shù)字的二進(jìn)制的補(bǔ)碼
計(jì)算機(jī)內(nèi)存的最小單位是位:1位只能存儲(chǔ)兩個(gè)狀態(tài)
8位 = 1字節(jié)
a度气、原碼:整數(shù)數(shù)字的二進(jìn)制形式
十進(jìn)制的10的二進(jìn)制原碼就是:1010
最高位是符號位,如果正數(shù)符號位為0膨报,負(fù)數(shù)符號位為1
以16位存儲(chǔ)數(shù)字的二進(jìn)制為例
10的原碼 00000000 00001010
-10的原碼 10000000 00001010
b磷籍、反碼
正數(shù)的反碼是它的原碼
負(fù)數(shù)的反碼就是這個(gè)數(shù)的原碼符號位不變,然后其他位置上的數(shù)取反(0->1,1->0)
-10 -> (原碼)10000000 00001010 ->(反碼)11111111 11110101
c现柠、補(bǔ)碼
正數(shù)的補(bǔ)碼就是它的原碼
負(fù)數(shù)的補(bǔ)碼是它的反碼加1
-10 -> (反碼)11111111 11110101 -> (補(bǔ)碼)1111111 11110110
d院领、總結(jié):正數(shù)的反碼和補(bǔ)碼都是原碼;負(fù)數(shù)的補(bǔ)碼是其反碼加1;反碼是原碼符號位不變够吩,其他位取反比然;
問題:為什么計(jì)算機(jī)存儲(chǔ)數(shù)據(jù)的時(shí)候存補(bǔ)碼鲸鹦?
答:因?yàn)橛?jì)算機(jī)中只有加法器兼砖,只能進(jìn)行加操作。
計(jì)算機(jī)存儲(chǔ)數(shù)字存的是其補(bǔ)碼膏萧,其加計(jì)算也是在補(bǔ)碼上完成的湾笛,
但最后結(jié)果反饋給人們看的時(shí)候饮怯,
我們需要看原碼,因?yàn)檠a(bǔ)碼無法直觀展示大泻垦小蓖墅;
原碼、反碼和補(bǔ)碼的意義:原碼是反饋給人們直觀看的;
反碼是一個(gè)中間值论矾,目的在于求出補(bǔ)碼以及返回原碼教翩;
補(bǔ)碼是用來給計(jì)算機(jī)進(jìn)行加操作的;
三贪壳、位運(yùn)算
計(jì)算存儲(chǔ)數(shù)字存補(bǔ)碼饱亿,計(jì)算的時(shí)候也是補(bǔ)碼,最后我們看結(jié)果看的是原碼
位運(yùn)算符:&(按位與)寥袭,|(按位或), ^(異或), ~(取反), >>(右移)路捧, <<(左移)
1、&(按位與)
數(shù)字1 & 數(shù)字2 :兩個(gè)都為1結(jié)果才是1传黄,否則為0杰扫;
3 & 2 --> 0000 0011 & 0000 0010 == 0000 0010
-3 & 2 --> 1111 1101 & 0000 0010 == 0000 0000
print(3&2) #2
print(-3&2) #0
作用:讓指定位上數(shù)置零,或者保留某一位上的值膘掰;
2章姓、|(按位或)
數(shù)字1 | 數(shù)字2: 只要有一個(gè)為1,結(jié)果就是1识埋;兩個(gè)都為0凡伊,結(jié)果才是0
3 | 2 --> 0000 0011 | 0000 0010 = 0000 0011
-3 | 2 --> 1111 1101 | 0000 0010 = (補(bǔ))1111 1111 = (原)1000 0001
print(3|2) #3
print(-3|2) #-1
3.^(異或)
數(shù)字1 ^ 數(shù)字2: 不同為1,相同為0
3^2 --> 0000 0011 ^ 0000 0010 = 0000 0001
-3^2 --> 1111 1101 ^ 0000 0010 = (補(bǔ))1111 1111 = 1000 0001
print(3^2) #1
print(-3^2) #-1
4.~(取反)
~數(shù)字:將每一位取反
~3 ---> ~0000 0011 = 1111 1100(補(bǔ)) = 1000 0100
~-3 ---> ~1111 1101 = 0000 0010
print(~3) #-4
print(~-3) #2
5.左移(重點(diǎn)掌握)
數(shù)字 << 位數(shù): 將補(bǔ)碼向左移動(dòng)指定的位數(shù)窒舟,
符號位不變系忙,在最后面補(bǔ)指定個(gè)數(shù)的0
規(guī)律(正數(shù)和負(fù)數(shù)都實(shí)用):m << n == m * (2^n)
print(10 << 1) # 20 10*2^1=20
print(-10 << 1) # -20 -20*2^1=-20
print(2 << 2) # 8 2*2^2=8
print(-23 << 2) # -92 -23*2^2=-92
# num * 2 == num << 1 ; num * 4 == num << 2
6.右移
數(shù)字 >> 位數(shù): 將補(bǔ)碼向右移動(dòng)指定的位數(shù)惠豺,符號位不變银还,
在符號位的后面補(bǔ)指定個(gè)數(shù)的0(正)或者1(負(fù))
規(guī)律(只適用于正數(shù)):m >> n == m // (2^n)
規(guī)律(只適用于能整除的負(fù)數(shù)):m >> n == m //(2^n)
規(guī)律(只適用于不能整除的負(fù)數(shù)):m >> n == m // (2^n)-1
print(10 >> 1) #5 10/2^1=5 (正數(shù))
print(10 >> 2) #2 10//2^2=2 (正數(shù))
print(-10 >> 1) #-5 -10//2^1=-5 (能被整除的負(fù)數(shù))
print(-10 >> 2) #-3 -10//2^2-1=-3 (不能被整除的負(fù)數(shù))
四、字符串
1洁墙、字符串(str)
定義:Python語言中蛹疯,通過單引號或者雙引號引起來的字符集就是字符串;
字符:字符串里的字符集热监,就是由各種不同的字符組成的捺弦;
例如:'fhoifjskddsjfsdsflds' '2132436570787'
'發(fā)揮而瘋狂的說法房間歐薩就發(fā)你是否對' 'がいに' '關(guān)鍵字'
2、Unicode編碼
Python中的字符串的字符采用的是Unicode編碼孝扛;
Unicode編碼:通過兩個(gè)字節(jié)來對一個(gè)字符進(jìn)行編碼列吼,
即可對0~2^16-1(65535)個(gè)字符進(jìn)行編碼,。它幾乎包含了世界上所有的符號苦始;
ASCII編碼:通過一個(gè)字節(jié)來對一個(gè)字符進(jìn)行編碼冈欢;
Unicode編碼中包含了ASCII編碼表;
chr(數(shù)字):獲取括號內(nèi)的數(shù)字在Unicode編碼表中對應(yīng)的字符盈简,
返回的是只有一個(gè)字符的字符串凑耻;
print(chr(4)) #EOT
ord(字符):獲取字符對應(yīng)的編碼值太示;
print(ord('蔣')) #33931
注意:也可以直接獲取字符對應(yīng)的編碼值,格式:\u十六進(jìn)制的編碼值香浩;
n1='gfr\u3124\ua23d積分';
print(n1)类缤;
3、轉(zhuǎn)義字符
一些特能和具有特殊意義的字符邻吭,直接放在字符串的引號中無效,需通過\來轉(zhuǎn)義餐弱;
print("hello\"world") # hello"world 中間雙引號之前不加\,會(huì)報(bào)語法錯(cuò)誤
\n表示換行囱晴;
print('好粉絲費(fèi)\n分手就分手') #在\n所處位置換行