python 中的進制轉換、原碼補碼和反碼、位運算

一. 2,8,10,16進制之間的轉換

1.進制的組成

在計算機中,有四種進制,分別是 2進制、8進制、10進制和16進制。python

計算機存儲數據時使用2進制,Unix系統中有些東西會使用8進製表示,計算機顯示出來的通常都是10進制,十六進制通常用來簡化2進制。算法

進制類型 組成 代碼格式
2進制 由2個數字組成,有0 和 1 0b101
8進制 由8個數字組成,有0,1,2,3,4,5,6,7 0o127
10進制 有10個數字組成,有0,1,2,3,4,5,6,7,8,9 258
16進制 有16個數字組成,有0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f (字母不區分大小寫, a至f分別表明10,11,12,13,14,15) 0xff、0Xff、0XFF

 

 

 

 


 

 

2.進制轉換

其餘進制轉換爲10進制的計算公式:∑X * Yn;
其中 X 爲第 n 位的數值,Y 爲進制值[2, 8, 16],n爲第幾位,注意:n 是從 0 開始。 python 中用於進制轉換的內置函數有:
  1. bin(x): 將 x 轉爲 2 進制.
  2. oct(x): 將 x 轉爲 8 進制.
  3. int(x, base=10): 將 x 轉爲 10 進制, 若是 x 是其餘的進制數的字符串, 則 base 應爲相應的進制數. 如 int("0b10100101", 2).也可使用 format 函數轉化, 具體能夠自行查閱.
  4. hex(x): 將 x 轉爲 16 進制. 

2.1.  2進制和10進制之間的轉換

(1)2進制轉化爲10進制:
2進制如 0b10100101 轉化爲十進制時,運算爲:1*2^0 + 0*2^1 + 1*2^2 + 0*2^3 + 0*2^4 + 1*2^5 + 0*2^6 + 1*2^7= 1 + 0 + 4 + 0 + 0 + 32 + 0 + 128 = 165
在Python中,可使用 int 內置函數來轉化爲2進制,例如:int(0b10100101)

(2)10進制轉化爲2進制
用待除數(如 426)除以2,得出的結果再去不停地除以2,直到除完最後的結果小於2中止,,在把每一個階段求得的餘數從下到上依次拼接完畢便可。
在Python中,可使用 bin 內置函數來轉化爲2進制,例如:bin(98)

2.2  8進制和10進制之間的轉換

(1)8進制轉化爲10進制:
將8進制(0o127)轉換爲10進制:運算爲:7*8^0 + 2*8^1 + 1*8^2 = 7 + 16 + 64 = 87
在Python中,可使用 oct 內置函數來轉化爲2進制,例如:int(0o127)

(2)10進制轉化爲8進制
例如:用426除以8,得出的結果再去不停地除以8, 直到除完最後的結果小於8中止, 在把每一個階段求得的餘數從下到上依次拼接完畢便可
在Python中,可使用 oct 內置函數來轉化爲2進制,例如:oct(426)

2.3  10進制與16進制之間的轉換

(1)16進制轉化爲10進制:
例如:帶轉化數爲0xff ,運算爲:15*16^0 + 15*16^1 = 255
在Python中,可使用 oct 內置函數來轉化爲2進制,例如:int(0x42a)

(2)10進制轉化爲16進制:
例如用426除以16,得出的結果再去不停地除以16, 直到除完最後的結果小於16中止, 在把每一個階段求得的餘數從下到上依次拼接完畢便可
在Python中,可使用 oct 內置函數來轉化爲2進制,例如:hex(426)

 

二. 原碼、補碼和反碼

1.  簡介

計算機的全部數據在底層都是以二進制的補碼形式存儲,實際人們看到的數字是原碼轉化來的,而原碼是經過補碼獲得的。
即:補碼 -> 原碼 -> 最後人們看到的數。
進制轉換的時候須要先把內存中存儲的補碼拿出來變成原碼在進行轉換輸出。

正數高位補0
負數高位補1(前面空白位全是1)

數字 1 00000000 1 正數高位都補0
數字-1 11111111   1 負數高位都補1

原碼: 用來轉換對應進制
反碼: 二進制碼0變1,1變0叫作反碼,反碼用於原碼補碼之間的轉換.(符號位不變)
補碼: 用來作數據的存儲運算. 補碼提出的根源是讓計算機底層的實現減法操做(能夠表達出一個數的正負)

言外之意:計算機默認只會作加法,例:5+(-3) => 5 - 3 乘法除法:是經過左移 << 和右移 >> 來實現

2.  運算

正數: 原碼 = 反碼 = 補碼
負數: 原碼 = 補碼取反+1 給補碼求原碼
負數: 補碼 = 原碼取反+1 給原碼求補碼
(原碼 反碼 補碼之間的轉換 , 符號位不要動)

 

三. 位運算 (偏算法)

前面提到, 計算機以二進制的形式存儲的. 而位運算說穿了, 就是直接對整數在內存中的二進制位進行操做, 不須要轉成 10 進制, 所以處理速度比較快.函數

1. 位運算經常使用的運算

  1. 與: &; 兩位都爲 1 時, 結果爲 1, 不然爲 0;
  2. 或: |; 兩位都爲 0 時, 結果爲 0, 不然爲 1;
  3. 異或: ^; 兩位相同爲 0, 相異爲 1
  4. 取反: ~; 0 變 1, 1 變 0;
  5. 左移: <<; 各二進制位所有左移若干位, 高位丟棄, 低位補 0;
  6. 右移: >>; 各二進制位所有右移若干位, 低位丟棄, 高位補 0; (有符號數, 各編譯器處理方法不同, 有的補符號位(算術右移), 有的補 0 (邏輯右移))

2. 異或操做的特色

x ^ 0 = x
x ^ 1s = ~x  # 1s 是二進制位所有位 1 的數, 下同
x ^ (~x) = 1s
x ^ x = 0
# 若是 a ^ b = c, 那麼 a^c = b, b^c = a 成立, 交換律
a ^ b = c  # ==> a^c = b, b^c = a
# 結合律
a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c

3. 經常使用的位運算操做

# 判斷奇偶, 至關於 (x % 2) == 1
x & 1 == 1 or == 0
# x 清零最低位的 1 x = x & (x - 1)
# 獲得最低爲的 1 x & -x

4. 更復雜的位運算操做

# 1. 將 x 最右邊的 n 位 清零
x & (~0 << n)
# 2. 獲取 x 的第 n 位值 (0 或 1) (x >> n) & 1
# 3. 獲取 x 的第 n 位的冪值 x & (1 << (n - 1))
# 4. 僅將第 n 位置爲 1 x | (1 << n)
# 5. 僅將第 n 位置爲 0 x & (~(1 << n))
# 6. 將 x 最高位至第 n 位(含)清 0 x & ((1 << n) - 1)
# 7. 將第 n 位至第 0 位(含)位清 0 x & (~((1 << (n + 1)) - 1))
相關文章
相關標籤/搜索