進制
Python 中的進制表示與轉換
進制的基本概念
- 二進制、八進制、十進制、十六進制的定義與特點
- 不同進制在計算機科學中的應用場景
Python 中的進制表示
- 二進制表示:使用
0b
前綴 - 八進制表示:使用
0o
前綴 - 十六進制表示:使用
0x
前綴 - 示例代碼:
binary_num = 0b1010
octal_num = 0o12
hex_num = 0xA
Python 中的進制轉換
- 十進制轉其他進制:使用
bin()
、oct()
、hex()
函數 - 其他進制轉十進制:使用
int()
函數 - 示例代碼:
decimal_num = 10
print(bin(decimal_num)) # 輸出: 0b1010
print(oct(decimal_num)) # 輸出: 0o12
print(hex(decimal_num)) # 輸出: 0xAbinary_num = '1010'
print(int(binary_num, 2)) # 輸出: 10
進制轉換的常見應用
- 數據存儲與傳輸中的進制轉換
- 網絡編程中的 IP 地址與端口號的進制表示
- 加密算法中的進制轉換
進制轉換的注意事項
- 不同進制之間的轉換精度問題
- 進制轉換中的溢出與截斷問題
- 示例代碼:
large_num = 0xFFFFFFFF
print(int(large_num)) # 輸出: 4294967295
進制轉換的進階技巧
- 使用
format()
函數進行進制格式化輸出 - 自定義進制轉換函數
- 示例代碼:
num = 255
print(format(num, 'b')) # 輸出: 11111111
print(format(num, 'o')) # 輸出: 377
print(format(num, 'x')) # 輸出: ff
2進制口訣:8421口訣
8421口訣是一種用于快速記憶二進制與十進制之間轉換的方法。它基于二進制的位權值,即每一位的權重分別是8、4、2、1。通過這個口訣,可以快速將二進制數轉換為十進制數,或者將十進制數轉換為二進制數。
8421口訣的使用方法
將二進制數的每一位與對應的位權值相乘,然后將結果相加,即可得到對應的十進制數。例如,二進制數1011
可以按照以下方式轉換為十進制:
1 * 8 = 8
0 * 4 = 0
1 * 2 = 2
1 * 1 = 1
將結果相加:8 + 0 + 2 + 1 = 11
,因此二進制數1011
對應的十進制數是11
。
示例
-
二進制數
1101
轉換為十進制:1 * 8 = 8 1 * 4 = 4 0 * 2 = 0 1 * 1 = 1
結果:
8 + 4 + 0 + 1 = 13
-
二進制數
1001
轉換為十進制:1 * 8 = 8 0 * 4 = 0 0 * 2 = 0 1 * 1 = 1
結果:
8 + 0 + 0 + 1 = 9
反向轉換
8421口訣也可以用于將十進制數轉換為二進制數。通過將十進制數分解為8、4、2、1的組合,可以快速得到對應的二進制數。例如,十進制數10
可以分解為8 + 2
,因此對應的二進制數為1010
。
?
需要哪一個相加,才能獲得要轉換的十進制的數,則在下方填1,若不需要則填0?
示例
-
十進制數
7
轉換為二進制:7 = 4 + 2 + 1
對應的二進制數為
0111
-
十進制數
12
轉換為二進制:12 = 8 + 4
對應的二進制數為
1100
通過8421口訣,可以快速進行二進制與十進制之間的轉換,特別適用于初學者或需要快速計算的場景。
進制轉換的實踐案例
- 實現一個簡單的進制轉換工具
- 處理大整數的進制轉換問題
- 示例代碼:
def convert_base(num, base):digits = "0123456789ABCDEF"if num < base:return digits[num]else:return convert_base(num // base, base) + digits[num % base]print(convert_base(255, 16)) # 輸出: FF
多進制轉十進制(計算方法)
二轉十
例如:2進制下的1010轉為十進制
0b1010=1*(2**3)+0*(2**2)+1*(2**1)+0*(2**0)
-->8+0+2+0
-->8+2
-->10
?八轉十
例如:8進制下的0o12轉為十進制
0o12=1*(8**1)+2*(8**0)
-->8+2
-->10
十六轉十?
例如:0x11轉為十進制
0x11=1*(16**1)+1*(16**0)
-->16+1
-->17
?多進制轉2進制轉16進制
一般計算16進制,我們先轉為2進制,再轉為16進制。
0o664通過421
-->0b110 110 100
-->0b1 1011 0100
0b1 1011 0100轉16進制
1011通過8421口訣
0b1-->0x1
-->1011-->8+4+1-->11-->0xb
0100通過8421
-->4
-->0x1b4
碼制(詳細可看C語言D5)
原碼:
有符號整數的二進制編碼方式,其中最高位表示符號位,0表示正數,1表示負數。其余位表示數值的絕對值。例如,+10的原碼為0000 1010,-10的原碼為1000 1010。
通常由原碼轉反碼,由反碼轉補碼,當補碼再補碼=原碼
補充:
為什么都是8位:
計算機中存儲的數據單位=1字節=8位
反碼:
反碼特點:
????????正數情況下與原碼的值不變
? ? ? ??負數情況下,符號位不變,但其他部分取反(0變1,1變0)
補碼:
在計算機系統中,數值一律用補碼來存儲
補碼特點:
? ? ? ? 對于正數來說,原碼、反碼、補碼皆相同
? ? ? ? 對于負數來說,其補碼=它的反碼加1
? ? ? ? 補碼符號位不動,其他位求反,最后整個 數+1,得到補碼
總結:
由-1來計算
原碼
0b1000 0001
反碼
0b1111 1110
補碼
0b1111 1111
邏輯運算符
邏輯
- 與邏輯==&
- 或邏輯==|
- 非邏輯==~
運算符
+,-,*,/,//向下取整數,%取模,**冪
python2中/和//都是除整
位運算符
- &位與,|位或,^異或,<<左移,>>右移
- ~按位取反,包括符合位
- &相當于相乘,|相當于相加,^相異出1
- 1<<2就是將1向左移動兩個位置,同理>>將1向右移動兩個位置
提問5&3=?
5 & 3
0b0000 0101
0b0000 0011 &
-----------------
0b0000 0001 1
5|3=?
5 | 3
0b0000 0101
0b0000 0011 |
-----------------
0b0000 0111 7
5^3=?
5 & 3
0b0000 0101
0b0000 0011 ^
-----------------
0b0000 0110 6
?1<<3=?
1 << 3
0b0000 0001 <<3
-----------------
0b0000 1000 8
相當于
1*(2**3)=85<<3
5*(2*3)=40
5>>3=?
5 & 3
0b0000 0101 >>
-----------------
5//(2**3) 0
~5=?
~5
0b0000 0101 ~
-----------------
0b1111 1010 補碼
0b1000 0110 原碼
-0b110
-6
?