程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python:位運算

編輯:Python

簡介:程序中的數在計算機內存中都是以二進制的形式存在的,位運算就是直接對整數在內存中對應的二進制位進行操作,一般是將數字化為二進制數後進行操作。

應用場景:在常規操作和位運算的操作中使用位運算,可以提升性能。但是會造成代碼難以理解,建議合理利用。

1、統計奇數
2、統計偶數
3、統計不相同數等
4、求相反數

位運算分有6種:
1、按位與:兩個位都為1時,結果才為1(統計奇數)即全1為1。
2、按位或:兩個位都為0時,結果才為0(統計偶數)即全0為0。
3、按位異或:兩個位相同為0,相異為1(常用統計不相同數)即不同為1。
4、按位取反:0變1,1變0,相當於 -x-1
5、左移運算:各二進位全部左移若干位,高位丟棄,低位補0。
6、右移運算:各二進位全部右移若干位,對無符號數,高位補0,有符號數進行補符號位(算術右移),或者補0(邏輯右移)。

案例源碼:

# -*- coding: utf-8 -*-
# time: 2022/5/22 17:56
# file: bitwise.py
# 公眾號: 玩轉測試開發
# &:兩個位都為1時,結果才為1(統計奇數)即全1為1。
a1 = 10
b1 = 9
""" 10 = 0b1010 9 = 0b1001 8 = 0b1000 """
print(bin(a1))
print(bin(b1))
print(a1 & b1) # 8
print(int("0b1000", 2))
# |:兩個位都為0時,結果才為0(統計偶數)即全0為0。
a2 = 10
b2 = 9
""" 10 = 0b1010 9 = 0b1001 11 = 0b1011 """
print(bin(a2))
print(bin(b2))
print(a2 | b2) # 11
print(int("0b1011", 2))
# ^:兩個位相同為0,相異為1(常用統計不相同數)即不同為1。
a3 = 10
b3 = 9
""" 10 = 0b1010 9 = 0b1001 3 = 0b0011 """
print(bin(a3))
print(bin(b3))
print(a3 ^ b3) # 11
print(int("0b0011", 2))
# ~:0變1,1變0,相當於 -x-1
a4 = 10
""" 10 = 0b1010 -x-1 = -11 """
print(bin(a4))
print(~a4) # -11
print(int("-0b1011", 2))
# 求相反數
print(~a4 + 1) # -10
# <<:各二進位全部左移若干位,高位丟棄,低位補0,即:x << n = x * (2 ** n)
a5 = 10
""" 10 = 0b1010 x = 10 * 2 ** 3 = 10 * 2 * 2 * 2 """
b5 = a5 << 3
print(bin(b5))
print(b5) # 80
print(int("0b1010000", 2))
# >>:各二進位全部右移若干位,對無符號數,高位補0,有符號數進行補符號位(算術右移),或者補0(邏輯右移)。
# 即:x << n = x / (2 ** n)
a6 = 64
""" 64 = 0b1000000 x = 64 / (2 ** 3) = 64 / (2 * 2 * 2) """
b6 = a6 >> 3
print(bin(b6))
print(b6) # 8
# 經典案例:使用 ^ 找出出現一次的數
a7 = 1 ^ 1 ^ 2
a8 = 1 ^ 2 ^ 1
a9 = 2 ^ 1 ^ 1
print(a7)
print(a8)
print(a9)
# 統計原始方法和位運算方法花費的時間
import time
loop = 30000000
start1 = time.time()
odd_list1 = []
for i in range(loop):
if i & 1 == 1:
odd_list1.append(i)
end1 = time.time()
print(f"time1:{
end1 - start1}")
start2 = time.time()
odd_list2 = []
for i in range(loop):
if i % 2 == 1:
odd_list1.append(i)
end2 = time.time()
print(f"time2:{
end2 - start2}")
# time1:5.262001037597656
# time2:4.736037492752075

微信公眾號:玩轉測試開發
歡迎關注,共同進步,謝謝!


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved