Python 3.1 快速導覽 - 位元運算

資料 (data) 儲存在電腦中的方式為利用 0 與 1 的編碼,例如八位元 (bit) 的整數 (integer) 25 為

0001 1001


另如 ASCII 編碼 (encoding) 中的字母 f 為
0110 0110


所謂的位元運算 (bit operation) ,就是逐位元進行比較,例如以上兩項編碼做邏輯或的位元運算
0001 1001 or 0110 0110


結果會是
0111 1111


Python 的位移運算子 (shifting operator) 也屬於位元運算子 (bitwise operator) 的一種,全部如下列表
運算子功能範例
<<向左位移a << n
>>向右位移a >> n
&位元且a & b
|位元包含或a | b
^位元互斥或a ^ b
~位元相反~a


以下例子示範位元運算子的使用
a = 5
b = 3

print(~a)
print(b << 2)
print(b >> 2)
print(a & b)
print(a | b)
print(a ^ b)

# 《程式語言教學誌》的範例程式
# http://pydoing.blogspot.com/
# 檔名:expr06.py
# 功能:示範 Python 程式 
# 作者:張凱慶
# 時間:西元 2010 年 12 月 */


執行結果如下



由於 5 用二進位 32 位元的表示為
0000 0000 0000 0000 0000 0000 0000 0101


取其補數變為
1111 1111 1111 1111 1111 1111 1111 1010


換算成十進位為 -6 。類似的 3 用二進位 32 位元的表示為
0000 0000 0000 0000 0000 0000 0000 0011


向左位移 2 個位元,變為
0000 0000 0000 0000 0000 0000 0000 1100


空出的位元補上 0 ,就變成十進位數字的 12 ,向左位移 2 個位元,就是原數乘上 22 ,也就是說乘以 4 。由於向右位移直接把位元移開,原空出的位元補上 0 ,就變成
0000 0000 0000 0000 0000 0000 0000 0000


所以兩個運算結果都是 0 。且、或、互斥或的運算,以二進位表示如下
101 and 011 = 001
101 or 011 = 111
101 xor 011 = 110


因此 3 且 5 ,結果會是 1 ; 3 或 5 ,結果為 7 ; 3 互斥或 5 ,結果則是 6 。


中英文術語對照
資料data
位元bit
整數integer
編碼encoding
位元運算bit operation
位移運算子shifting operator
位元運算子bitwise operator






4 則留言:

藍天小綿羊 提到...

運算子欄位的[a<<n]應該是向左位移n吧?

Kaiching Chang 提到...

這部份打錯字了,已修改,感謝指正 :)

Python 提到...

Thank you so much for this post.
Python Online Training
Data Science Online Training

Unknown 提到...



由於 5 用二進位 32 位元的表示為
0000 0000 0000 0000 0000 0000 0000 0101


取其補數變為
1111 1111 1111 1111 1111 1111 1111 1010


換算成十進位為 -6 。

請教一下,為什麼換算成十進位會是-6呢??