Python如何高效使用位運算符

Python位運算符

按位運算符是把數字看作二進制來進行計算的,使用正確將會大大優化程序,如進制轉化。Python中的按位運算法則如下:

變量 a 爲 60,b 爲 13,二進制格式如下:

  • a = 0011 1100;
  • b = 0000 1101;
運算符 描述 實例
& 按位與運算符:參與運算的兩個值,如果兩個相應位都爲1,則該位的結果爲1,否則爲0 (a & b) 輸出結果 12 ,二進制解釋: 0000 1100
\ 按位或運算符:只要對應的二個二進位有一個爲1時,結果位就爲1 (a | b) 輸出結果 61 ,二進制解釋: 0011 1101
^ 按位異或運算符:當兩對應的二進位相異時,結果爲1 (a ^ b) 輸出結果 49 ,二進制解釋: 0011 0001
~ 按位取反運算符:對數據的每個二進制位取反,即把1變爲0,把0變爲1 , ~x 類似於 -x-1 (~a ) 輸出結果 -61 ,二進制解釋: 1100 0011,在一個有符號二進制數的補碼形式
<< 左移動運算符:運算數的各二進位全部左移若干位,由 << 右邊的數字指定了移動的位數,高位丟棄,低位補0 a << 2 輸出結果 240 ,二進制解釋: 1111 0000
>> 右移動運算符:把">>"左邊的運算數的各二進位全部右移若干位,>> 右邊的數字指定了移動的位數 a >> 2 輸出結果 15 ,二進制解釋: 0000 1111
#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
a = 60            # 60 = 0011 1100 
b = 13            # 13 = 0000 1101 
c = 0

c = a & b;        # 12 = 0000 1100
print ("1 - c 的值爲:",c)
 
c = a | b;        # 61 = 0011 1101 
print ("2 - c 的值爲:", c)
 
c = a ^ b;        # 49 = 0011 0001
print ("3 - c 的值爲:", c)
 
c = ~a;           # -61 = 1100 0011
print ("4 - c 的值爲:", c)
 
c = a << 2;       # 240 = 1111 0000
print ("5 - c 的值爲:", c)
 
c = a >> 2;       # 15 = 0000 1111
print ("6 - c 的值爲:", c)

1)<<按位左移
各二進位全部左移n位,高位丟棄,低位補0
x << n 左移 x 的所有二進制位向左移動n位,移出位刪掉,移進的位補零

a. 左移1位相當於乘以2
用途:快速計算一個數乘以2的n次方 (8<<3 等同於8*2^3)
b.左移可能會改變一個數的正負性
2)>>按位右移
各二進位全部右移n位,保持符號位不變
x >> n, x的所有二進制位向右移動n位,移出的位刪掉,移進的位補符號位, 右移不會改變一個數的符

右移1位相當於除以2
x 右移 n 位就相當於除以2的n次方
用途:

  • 快速計算一個數除以2的n次方 (8>>3 等同於8/2^3)
  • 可以使用右移代替二分查找堆的插入操作

3)使用舉例:
使用**>>**右移運算計算一個數的二進制表示:

a = 13            # 13 = 0000 1101 
c = []
for i in range(4):#這裏4,因爲2^4>13
    b = a >> i &1# 每次右移一位,相當於原數除2取整,和1取&與運算
    c.append(b)
print ("c 的二進制表示爲:",c[::-1])
# c 的二進制表示爲: [1, 1, 0, 1]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章