一望几,進(jìn)制
在計(jì)算機(jī)編程中端礼,整數(shù)可以通過十進(jìn)制括饶,二進(jìn)制,八進(jìn)制和十六進(jìn)制來表示
1.進(jìn)制
"""
1.十進(jìn)制
基數(shù): 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
進(jìn)位: 逢10進(jìn)1 比如9馬上遇到10 就會(huì)進(jìn)1 所以為10
位權(quán): 123(10) = 100 + 20 + 3 = 3+10的0次方 + 2乘10的1次方 + 1乘10的2次方
=1*10**2 + 2*10**1 + 3+10**0
2.二進(jìn)制
基數(shù): 0, 1
0111, 1100, 101010101, 111111100001
b.進(jìn)位: 逢2進(jìn)1
100(2) == 4(10) 101(2) == 5(10)
c.位權(quán): 101(2)= 1乘2的0次方 + 0乘2的1次方 + 1乘2的2次方 = 5
3.八進(jìn)制
a.基數(shù): 0, 1, 2, 3, 4, 5, 6, 7
b.進(jìn)位: 逢8進(jìn)1
c.位權(quán): 123(8) = 3乘8的0次方 + 2乘8的1次方 + 1乘8的2次方 = 3 + 16 + 64 = 83
111(8) = 8的0次方+8的1次方+8的2次方 = 1+8+64 = 73
4.十六進(jìn)制
a.基數(shù): 0-9恕洲,a/A - f/F -- a/A(10), b/B(11), c/C(12), d/D(13), e/E(14), F/f(15)
1f, ff, abc, a00bf
b.進(jìn)位: 逢16進(jìn)1
c.位權(quán): 123(16) = 3乘16的0次方 + 2乘16的1次方 + 3乘16的2次方 = 3+32+256 = 291
"""
1.程序中怎么表示不同進(jìn)制的數(shù)
a.在程序中直接寫的數(shù)字都是10進(jìn)制
num = 110 # 這是一個(gè)10進(jìn)制數(shù)
print(num) # 直接打印其他進(jìn)制數(shù)就會(huì)顯示他的十進(jìn)制
b.二進(jìn)制
0b/B+二進(jìn)制數(shù)
num = 0b1110
print(num) # 2+4+8 = 14
# num2 = 0b123 # 錯(cuò)誤塔橡!二進(jìn)制只能是0或1
print(bin(800)) # 獲取一個(gè)數(shù)對(duì)應(yīng)的二進(jìn)制方式
print(bin(0o671)) # 110111001
print(bin(0xaf)) # 10101111
print(bin(100))
c.八進(jìn)制
0o/O+八進(jìn)制數(shù)
num = 0o176
print(num)
# num = 0o78 # 錯(cuò)誤!8沒在八進(jìn)制范圍內(nèi)
print(oct(800)) # 0o1440
print(oct(0b111000101)) # 0o705
d.十六進(jìn)制
0x/X + 十六進(jìn)制數(shù)
num = 0xaf2
print(num)
# num = 0xah # 錯(cuò)誤霜第!
print(hex(19968))
print(hex(175)) # 0xaf
print(hex(255)) # 0xff
num1 = 17
num2 = 0b10001 # 17
num3 = 0o21 # 17
num4 = 0x11 # 17
print(num1, num2, num3, num4)
num = 21
print(bin(21)) # 1
二葛家,binary(二進(jìn)制)
"""
計(jì)算機(jī)存儲(chǔ)數(shù)據(jù)只能存儲(chǔ)數(shù)字?jǐn)?shù)據(jù),而且存的是數(shù)字的補(bǔ)碼泌类。
計(jì)算機(jī)對(duì)數(shù)據(jù)進(jìn)行運(yùn)輸?shù)臅r(shí)候是使用補(bǔ)碼進(jìn)行運(yùn)算的惦银,將數(shù)據(jù)從計(jì)算機(jī)中讀出來看到的是原碼
1.原碼:符號(hào)位 + 真值
說明:
符號(hào)位:最高位用0表示正數(shù),1表示負(fù)數(shù)
真值:去掉正負(fù)(符號(hào)位)末誓,數(shù)字對(duì)應(yīng)的二進(jìn)制值
100的原碼: 01100100 # 第一個(gè)0表示正數(shù)
-100的原碼: 11100100 # 第一個(gè)1表示負(fù)數(shù)
2.反碼:
正數(shù)的反碼:就是原碼
負(fù)數(shù)的反碼:原碼的符號(hào)位不變,其余的位數(shù)取反(0 -> 1, 1 -> 0)
100的反碼:01100100
-100的反碼:10011011
反碼就是求補(bǔ)碼书蚪,沒啥用喇澡,就是為了求補(bǔ)碼
3.補(bǔ)碼
正數(shù)的補(bǔ)碼:還是原碼
負(fù)數(shù)的補(bǔ)碼:反碼加1
100的補(bǔ)碼:01100100
-100的補(bǔ)碼:10011100
1+1 = 0 + 1
-50的原碼,反碼殊校,補(bǔ)碼
原碼:1110010
反碼:1001101
補(bǔ)碼:1001110
存是補(bǔ)碼晴玖,取出時(shí)原碼,因?yàn)橛?jì)算機(jī)只有加法器,沒有減法器
"""
4.為什么計(jì)算機(jī)要存補(bǔ)碼呕屎?
"""
因?yàn)橛?jì)算機(jī)中只有加法器让簿,沒有減法器
3 - 2 --> 3 + (-2) = 1 # 計(jì)算機(jī)里面是這樣算的
2-3 --> 2 + (-3)
3的原碼:011
-2的原碼:110
# 存原碼:
3-2 = 011 + 110 = 001
-3的原碼:111 反碼:100 補(bǔ)碼:101
2的原碼:010 都是010
# 存原碼算
2-3 = 110 + 010 = 1001(原) = 1
補(bǔ)碼算
010+101 =111(補(bǔ)碼)=111-1=110(反碼)=101(原)=-1
-3 + -2 = -5
-3原碼:1011 反:1100 補(bǔ):1101
-2原碼:1010 反:1101 補(bǔ):1110
原碼算:
-3 + -2 = 1011+1010 = 0101(原) = 5
補(bǔ)碼算:
1101 + 1110 =1011(補(bǔ))=1010(反)=1101(原)= -5
# 1101 - 前面1是負(fù)數(shù)的意思 1*2**0+0*2**1+1*2**2=5 所以-5
1+1 = 0 (逢2進(jìn)1)
0+1 =1
"""
位運(yùn)算:&(按位與), |(按位或運(yùn)算), ~(按位取反), ^(按位異或), <<(左移), >>(右移)
"""
數(shù)字1 & 數(shù)字2 --> 每一位上的數(shù)都為1結(jié)果就是1,有0就是0
0111(補(bǔ)碼) & 1101(補(bǔ)碼) --> 0101(補(bǔ)碼) (從后面算)
1 & 1 = 1
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0
特點(diǎn):一個(gè)位上的數(shù)如果和1與秀睛,可以保留這個(gè)位上的數(shù)尔当;和0與可以置0
應(yīng)用:判斷一個(gè)數(shù)的奇偶性(如果一個(gè)數(shù)的二進(jìn)制的最低位是1就是奇數(shù),否則是偶數(shù))
num % 2 == 0 --> num是偶數(shù)(傳統(tǒng))
num & 1 == 0 --> num是偶數(shù)
num & 1 == 1 -->num是奇數(shù)
"""
print(3 & 2) # 3的補(bǔ)碼0011 & 2的補(bǔ)碼0011 =1100(補(bǔ)碼)=2
print(-3 & -2)
"""
-3:-3原碼:1011 反:1100 補(bǔ):1101
-2原碼:1010 反:1101 補(bǔ):1110
1101 & 1110 = 1100(補(bǔ)碼) = 1010(反) = 1100 = -4
"""
print(2 & 1, 200 & 1, -100 & 1)
print(5 & 1, 111 & 1, -13 & 1)
"""
數(shù)字1 | 數(shù)字2:只要有1結(jié)果就是1蹂安,兩個(gè)都為0結(jié)果才是0
1 | 1 = 1
1 | 0 = 1
0 | 1 =1
0 | 0 = 0
特點(diǎn): 和1或椭迎,置1
"""
print(3 | 2) # 0011 | 0010 = 0011(補(bǔ))
print(-3 | -2) # 1101 | 1110 = 1111(補(bǔ)) = 1110(反) = 1001(原碼)
"""
~數(shù)字 : 將數(shù)字上的每一位取反
~1 = 0
~0 = 1
"""
print(~3) # ~0011 = 1100(補(bǔ)) = 1011(反)=1100 = -4
print(~-4) # ~~3 = 3 取反兩次等于本身
"""
數(shù)字1 ^ 數(shù)字2 : 相同為0,不同為1
1 ^ 1 =0
1 ^ 0 =1
0 ^ 1 =1
0 ^ 0 =0
應(yīng)用:加密
"""
print(3 ^ 2) # 0011 ^ 0010 = 0001 = 1
print(1 ^ 2) # 1 ^ 2 = 3
"""
數(shù)字1 << N:數(shù)字1左移N位, 數(shù)字1* 2N
數(shù)字1 >> N: 數(shù)字1右移N位 數(shù)字1 // 2N
應(yīng)用:快速乘2的多少次方/除2的次方 (面試)
"""
print(4 << 1) # 4*2**1 = 8
print(-3 << 2) # -3*2**2 = -12
計(jì)算值 要將原碼轉(zhuǎn)換成補(bǔ)碼,首先要通過轉(zhuǎn)換成反碼,反碼再轉(zhuǎn)換成補(bǔ)碼田盈,再來用位運(yùn)算, 輸出結(jié)果是原碼畜号,
所以結(jié)果要將補(bǔ)碼再轉(zhuǎn)換成原碼.