Day-3 - 進(jìn)制和字符串(2018-09-27)

一、進(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 = 273

  • b.十進(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) 7B

  • c.二進(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 111

  • d.二進(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 0111

  • e.十六進(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 00001010

  • b.反碼
    正數(shù)的反碼是它的原碼
    負(fù)數(shù)的反碼就是這個數(shù)的原碼的符號位不變,然后其他位置上的數(shù)取反(0->1,1->0)
    -10 -> (原碼)10000000 00001010 -> (反碼) 11111111 11110101

  • c.補(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)算符:&(按位與),|(按位或),^(異或),~(取反),>>(右移),<<(左移)

  1. &(按位與):
    數(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ù)置零,或者保留某一位上的值

  1. |(按位或)
    數(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
  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
  1. ~(取反)
    ~數(shù)字:將每一位取反
    ~3 ---> ~00000011 = 11111100(補(bǔ)) = 1111 1011(反) = 1000 0100(原)
    ~-3 ---> ~1111 1101 = 0000 0010
print(~3) # -4
print(~-3) # 2
  1. << (左移)
    數(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í)行速度快

  1. >> (右移)
    數(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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容