一、進(jìn)制
計(jì)算機(jī)在存儲數(shù)字的時候都是以二進(jìn)制的形式存儲的
| 十進(jìn)制 | 二進(jìn)制 | 八進(jìn)制 | 十六進(jìn)制 | |
|---|---|---|---|---|
| 基數(shù) | 0,1,2,3,4,5,6,7,8,9 | 0,1 | 0,1,2,3,4,5,6,7 | 0-9,a-f(A-F) |
| 進(jìn)位 | 逢10進(jìn)1 | 逢2進(jìn)1 | 逢8進(jìn)1 | 逢16進(jìn)1 |
| 每位的值 | 111 = 1 * 10^0 + 1* 10^1 + 1 * 10^2 = 111 | 111 = 1 * 2^0 + 1 * 2^1 + 1 * 2^2 = 7 | 111 = 1 * 8^0 + 1 * 8^1 + 1 * 8^2 = 73 | 111 = 1 * 16^0 + 1 * 16^1 + 1 * 16^2 = 273 |
進(jìn)制之間的轉(zhuǎn)換
a.其他進(jìn)制轉(zhuǎn)換成10進(jìn)制:每一位上的數(shù)乘以進(jìn)制冪次數(shù),然后求和
例:111 = 1 * 16^0 + 1 * 16^1 + 1 * 16^2 = 273b.十進(jìn)制轉(zhuǎn)其他進(jìn)制:
輾轉(zhuǎn)取余法(不斷除以進(jìn)制取余,直到除到商為0為止,從最后取的余數(shù)開始寫(最后取的寫高位))
例:十進(jìn)制轉(zhuǎn)二進(jìn)制: 123:(2) 1111011 60:(2) 111100
例:十進(jìn)制轉(zhuǎn)八進(jìn)制: 123:(8) 173
例:十進(jìn)制轉(zhuǎn)十六進(jìn)制: 123:(16) 7Bc.二進(jìn)制轉(zhuǎn)八進(jìn)制:每3位二進(jìn)制轉(zhuǎn)換成1位
八進(jìn)制轉(zhuǎn)二進(jìn)制:每1位8進(jìn)制轉(zhuǎn)換成3位的二進(jìn)制
(8)67 --> (2) 110 111d.二進(jìn)制轉(zhuǎn)十六進(jìn)制:每4位二進(jìn)制轉(zhuǎn)換成1位
十六進(jìn)制轉(zhuǎn)二進(jìn)制:一位的16進(jìn)制轉(zhuǎn)換成4位的二進(jìn)制
(16)67 --> (2) 0110 0111e.十六進(jìn)制和八進(jìn)制互轉(zhuǎn):都先轉(zhuǎn)換為二進(jìn)制,再轉(zhuǎn)換為八/十六進(jìn)制
python對進(jìn)制的支持
python支持通過二進(jìn)制、八進(jìn)制、十進(jìn)制和十六進(jìn)制的形式來直接表示整數(shù)
- a.十進(jìn)制:直接寫的數(shù)字的值都是十進(jìn)制的數(shù)
10
100
76
# 78a #SyntaxError: invalid syntax
- b.二進(jìn)制:需要加前綴 -> 0b
0b1010
- c.八進(jìn)制:需要加前綴 -> 0o
0o67
# 0o68 # SyntaxError: invalid syntax
- d.十六進(jìn)制:需要加前綴 ->0x/0X
0x78af
0Xdf3
各進(jìn)制數(shù)可以參與運(yùn)算,在計(jì)算機(jī)底層統(tǒng)一為二進(jìn)制計(jì)算,以10進(jìn)制返回結(jié)果
num = 0b1101 + 0xaf2
print(num) # 2815
- e.python中進(jìn)制的轉(zhuǎn)換(結(jié)果是字符串)
bin(整數(shù)) --> 將括號中的整數(shù),轉(zhuǎn)換成二進(jìn)制形式的數(shù)
print(bin(100),bin(0o56),bin(0xdf2)) # 0b1100100 0b101110 0b110111110010
print(type(bin(100))) # <class 'str'>
oct(整數(shù)) --> 將括號中的整數(shù),轉(zhuǎn)換成八進(jìn)制形式
print(oct(100),oct(0b0111),oct(0xdf2)) # 0o144 0o7 0o6762
hex(整數(shù)) --> 將括號中的整數(shù),轉(zhuǎn)換成十六進(jìn)制形式
print(hex(100),hex(0b11010111),hex(0o763)) # 0x64 0xd7 0x1f3
二、原碼、反碼和補(bǔ)碼
計(jì)算機(jī)在存數(shù)字的時候,存的是數(shù)字的二進(jìn)制的補(bǔ)碼
計(jì)算機(jī)內(nèi)存的最小單位是位:1位只能存儲兩個狀態(tài)
8位 = 1字節(jié)
C語言int型(32位)數(shù)字1:
00000000 00000000 00000000 00000001
a.原碼:整數(shù)數(shù)字的二進(jìn)制形式
十進(jìn)制的10的原碼:1010
最高位是符號位,如果是整數(shù)符號位為0,負(fù)數(shù)符號位為1
10的原碼 00000000 00001010
-10的原碼 10000000 00001010b.反碼
正數(shù)的反碼是它的原碼
負(fù)數(shù)的反碼就是這個數(shù)的原碼的符號位不變,然后其他位置上的數(shù)取反(0->1,1->0)
-10 -> (原碼)10000000 00001010 -> (反碼) 11111111 11110101c.補(bǔ)碼
正數(shù)的補(bǔ)碼就是它的原碼
負(fù)數(shù)的補(bǔ)碼就是它的反碼加1
-10 -> (反碼) 11111111 11110101 -> (補(bǔ)碼) 11111111 11110110
總結(jié):正數(shù)的反碼和補(bǔ)碼都是原碼;負(fù)數(shù)的補(bǔ)碼是反碼加1,反碼是原碼符號位不變,其他位取反
為什么計(jì)算機(jī)存儲數(shù)據(jù)的時候存補(bǔ)碼?:計(jì)算機(jī)只有加法器,只能進(jìn)行加操作,存原碼對負(fù)數(shù)進(jìn)行加操作的時候有問題
三、位運(yùn)算
計(jì)算機(jī)存數(shù)字存補(bǔ)碼,計(jì)算的時候也是補(bǔ)碼,最后結(jié)果看的時候看原碼
位運(yùn)算符:&(按位與),|(按位或),^(異或),~(取反),>>(右移),<<(左移)
- &(按位與):
數(shù)字1 & 數(shù)字2:二進(jìn)制的每一位,兩個都為1,結(jié)果才是1,否則為0
3 & 2 --> 00000011 & 00000010 == 00000010
-3 & 2 --> 11111101 & 00000010 == 00000000
print(3&2) # 2
print(-3&2) # 0
作用:讓指定位上數(shù)置零,或者保留某一位上的值
- |(按位或)
數(shù)字1 | 數(shù)字2:二進(jìn)制的每一位,只要有一個位1,結(jié)果就是1,;兩個都為0,結(jié)果才是0
3 | 2 --> 00000011 | 00000010 == 00000011
-3 | 2 --> 11111101 | 00000010 == 1111 1111(補(bǔ)碼) == 1111 1110(反碼) == 1000 0001(原碼)
print(3|2) # 3
print(-3|2) # -1
- ^(異或)
數(shù)字1 ^ 數(shù)字2:二進(jìn)制的每一位,不同為1,相同為0
3 ^ 2 --> 00000011 ^ 00000010 == 00000001
-3^2 --> 1111 1101 ^ 00000010 == (補(bǔ))1111 1111 == (原)1000 0001
print(3^2) # 1
print(-3^2) # -1
- ~(取反)
~數(shù)字:將每一位取反
~3 ---> ~00000011 = 11111100(補(bǔ)) = 1111 1011(反) = 1000 0100(原)
~-3 ---> ~1111 1101 = 0000 0010
print(~3) # -4
print(~-3) # 2
- << (左移)
數(shù)字 << 位數(shù):將補(bǔ)碼向左移動指定的位數(shù),在最后面補(bǔ)指定個數(shù)的0
(摘自CSDN)負(fù)數(shù)的左移:和整數(shù)左移一樣,在負(fù)數(shù)的二進(jìn)制位右邊補(bǔ)0,一個數(shù)在左移的過程中會有正有負(fù)的情況,所以切記負(fù)數(shù)左移不會特殊處理符號位。如果一直左移,最終會變成0。
- 規(guī)律(正數(shù)和負(fù)數(shù)都適用):m << n == m * (2^n)
print(-10 << 1) # -20
print(10 << 3) # 80
num * 2 推薦使用 num << 1,位運(yùn)算效率高,執(zhí)行速度快
-
>>(右移)
數(shù)字 >> 位數(shù):將補(bǔ)碼向右移動指定的位數(shù),符號位不變,在符號位的后面補(bǔ)指定個數(shù)的0(正數(shù))或者1(負(fù)數(shù))
- 規(guī)律(只適用于正數(shù))m >> n == m // (2^n)
print(10 >> 1) # 5
print(10 >> 2) # 2
print(-10 >> 1) # -5
print(-10 >> 2) # -3
# 練習(xí):
# print(-15 >> 1)
# print(17 << 2)
四、認(rèn)識字符
字符串(str)
1. 什么是字符串
python中通過單引號或者雙引號引起來的字符集就是字符串
字符串中引號中的字符集,就是由各種不同的字符來組成的
例:
'老白干'
"welcome"
"^_^"
'1234'
'in'
'82年拉菲'
2. Unicode編碼
python中的字符串中的字符采用的是Unicode編碼
Unicode編碼:是通過兩個字節(jié)來對一個字符進(jìn)行編碼,0 ~ (2^16-1)(65535),幾乎包含了世界上所有的符號
ASCII編碼:通過一個字節(jié)來對一個字符進(jìn)行編碼
Unicode編碼中包含了ASCII碼表
print(2**16-1)
'a' --> 97
'b' --> 98
- chr(數(shù)字):獲取數(shù)字在Unicode編碼表中對應(yīng)的字符
print(chr(97)) # a
print(chr(0x1897)) # ?
for i in range(0x0900,0x0980):
print(chr(i),end='')
print('')
- ord(字符):獲取字符對應(yīng)的Unicode碼
print(ord('余'),ord('笑'),ord('宇')) # 20313 31505 23431
可以直接在字符串中寫字符對應(yīng)的編碼值,格式:\u四位的十六進(jìn)制的編碼值(不帶0x前綴)
str1 = '\u4f59'
str2 = '\u4f59\u7b11\u5b87'
print(str1) # 余
print(str2) # 余笑宇
3. 轉(zhuǎn)義字符(適用于所有語言)
一些特殊功能和具有特殊意義的字符,直接放在字符串的引號中無效,需要通過\來轉(zhuǎn)義
\n --> 換行
\' --> '
\t --> 制表符(相當(dāng)于tab)
\\ --> \
\" --> "
注意:轉(zhuǎn)義字符是一個字符
str3 = 'dfsf\nfsfwe'
print(str3)
# dfsf
# fsfwe