iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 10
0
自我挑戰組

從寫程式到脫離菜雞的歷練(以python為主的資處與檔案權限)系列 第 10

[D10] python二進位運算

學習動機:資料有時也需轉換成2進制處理 所以也是要有點進制觀念喔


2進位運算子

我們已經知道電腦是用2進位來運算了,網頁資料庫儲存媒體資料也是如此 雖然這次沒有要用DB,但要了解bin檔案的操作仍要學習各種常用轉制。

  • 位元與位元組關係
    計算機存的資料不只英文跟數字,而是可存多種編碼的各國語言。這時就會因為編碼超過基本單位而須更大的單位表示:
    1bit == 1位元(16進制A~F或數字) , 1byte == 8bit(可存文字編碼)
  • 電腦表示進值法

0b數值 == bin() == 2進位制
0o數值 == oct() == 8進位制
0x數值 == hex() == 16進位制
數值 == int() == 10進位制

  • Binary二補數
    因為一補數存在著許多問題(像少一位 , 有+-0等),會對電腦在複雜計算時產生問題,所以就衍生出了二補數為主要計算機運算
    有個數值 0b110 = int(6) , 二補數換算後: -0b111 = int(-7)

以下是2補數在8位元(1byte) 的範圍:
0 1 1 1 1 1 1 1 = 127
0 0 0 0 0 0 1 0 = 2
0 0 0 0 0 0 0 1 = 1
0 0 0 0 0 0 0 0 = 0
1 1 1 1 1 1 1 1 = −1
1 1 1 1 1 1 1 0 = −2
1 0 0 0 0 0 0 1 = −127
1 0 0 0 0 0 0 0 = −128


Ex:(2補數運算) 2's = ~x

print(~0b10) #2s
print(~0o2)  #8s
print(~0x2) #16s
print(~2) #10s
  • 各進制二補數
    你一定會說,奇怪 為何我這樣進行2補數 仍然可運作(2補數不是只有2進位的專利嗎?)
print(~0xFFF)
print(~0o777)  #先轉2s在轉回來
print(bin(~999))  #10 to 2
print(hex(0b100110)) #2 to 16
print(int(0xABC))    #16 to 10

原來程式原始的運算都是透過2進制來運算,所以其他進制的2補數當然也是轉2進位直接處理


位移

資料移位,是資料做不同介面處理的方法 透過位移資料來完成儲存與讀取
軟體就用在資料的替換加密, 但要小心別溢位(資料損失或錯誤)
而程式的位移就可以改善程式執行高重複迴圈問題。尤其用在單晶片8051 , arduino最明顯,單晶片運算記憶體小 所以用來顯示led迴圈控制可用位移代替

print(bin(0b0110>>2)) #溢位
print(bin(0b0110<<2))  #無溢位有進位 ,成功位移
print(0x3CA<<2)
  • 程式溢位檢查
    溢位:以硬體來講就是目標儲存記憶體不夠 部分資料存不進去產生移失
    要訣:先換2進位,判斷是否可容許位移
print(0xAD15F>>10) #是否資料損失?
print(len(bin(0xAD15F))) #可知0不夠位移 位移一定錯誤

真實狀況:圖片處理位移時被邊框吃掉


整理2進運算子:

&	AND
|	OR
^	XOR
~	取2補數
<< 	左移
>> 	右移

上一篇
[D9] 軟體der萬用邏輯XOR
下一篇
[D11] 程式設計法
系列文
從寫程式到脫離菜雞的歷練(以python為主的資處與檔案權限)32

尚未有邦友留言

立即登入留言