網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
詳解Python中位運(yùn)算的簡(jiǎn)單實(shí)現(xiàn)_python
作者:玩轉(zhuǎn)測(cè)試開(kāi)發(fā) ? 更新時(shí)間: 2022-08-19 編程語(yǔ)言簡(jiǎn)介
程序中的數(shù)在計(jì)算機(jī)內(nèi)存中都是以二進(jìn)制的形式存在的,位運(yùn)算就是直接對(duì)整數(shù)在內(nèi)存中對(duì)應(yīng)的二進(jìn)制位進(jìn)行操作,一般是將數(shù)字化為二進(jìn)制數(shù)后進(jìn)行操作。
應(yīng)用場(chǎng)景
在常規(guī)操作和位運(yùn)算的操作中使用位運(yùn)算,可以提升性能。但是會(huì)造成代碼難以理解,建議合理利用。
1、統(tǒng)計(jì)奇數(shù)
2、統(tǒng)計(jì)偶數(shù)
3、統(tǒng)計(jì)不相同數(shù)等
4、求相反數(shù)
位運(yùn)算分有6種:
1、按位與:兩個(gè)位都為1時(shí),結(jié)果才為1(統(tǒng)計(jì)奇數(shù))即全1為1。
2、按位或:兩個(gè)位都為0時(shí),結(jié)果才為0(統(tǒng)計(jì)偶數(shù))即全0為0。
3、按位異或:兩個(gè)位相同為0,相異為1(常用統(tǒng)計(jì)不相同數(shù))即不同為1。
4、按位取反:0變1,1變0,相當(dāng)于 -x-1
5、左移運(yùn)算:各二進(jìn)位全部左移若干位,高位丟棄,低位補(bǔ)0。
6、右移運(yùn)算:各二進(jìn)位全部右移若干位,對(duì)無(wú)符號(hào)數(shù),高位補(bǔ)0,有符號(hào)數(shù)進(jìn)行補(bǔ)符號(hào)位(算術(shù)右移),或者補(bǔ)0(邏輯右移)。
案例源碼
# -*- coding: utf-8 -*-
# time: 2022/5/22 17:56
# file: bitwise.py
# 公眾號(hào): 玩轉(zhuǎn)測(cè)試開(kāi)發(fā)
# &:兩個(gè)位都為1時(shí),結(jié)果才為1(統(tǒng)計(jì)奇數(shù))即全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))
# |:兩個(gè)位都為0時(shí),結(jié)果才為0(統(tǒng)計(jì)偶數(shù))即全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))
# ^:兩個(gè)位相同為0,相異為1(常用統(tǒng)計(jì)不相同數(shù))即不同為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,相當(dāng)于 -x-1
a4 = 10
"""
10 = 0b1010
-x-1 = -11
"""
print(bin(a4))
print(~a4) # -11
print(int("-0b1011", 2))
# 求相反數(shù)
print(~a4 + 1) # -10
# <<:各二進(jìn)位全部左移若干位,高位丟棄,低位補(bǔ)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))
# >>:各二進(jìn)位全部右移若干位,對(duì)無(wú)符號(hào)數(shù),高位補(bǔ)0,有符號(hào)數(shù)進(jìn)行補(bǔ)符號(hào)位(算術(shù)右移),或者補(bǔ)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
# 經(jīng)典案例:使用 ^ 找出出現(xiàn)一次的數(shù)
a7 = 1 ^ 1 ^ 2
a8 = 1 ^ 2 ^ 1
a9 = 2 ^ 1 ^ 1
print(a7)
print(a8)
print(a9)
# 統(tǒng)計(jì)原始方法和位運(yùn)算方法花費(fèi)的時(shí)間
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
原文鏈接:https://blog.csdn.net/hzblucky1314/article/details/125493985
相關(guān)推薦
- 2022-08-31 C++中關(guān)于this指針的入門介紹_C 語(yǔ)言
- 2022-06-15 C++?詳解數(shù)據(jù)結(jié)構(gòu)中的搜索二叉樹(shù)_C 語(yǔ)言
- 2023-05-23 docker-compose統(tǒng)一管理多個(gè)容器使用詳解_docker
- 2022-02-05 Tableau中如何將兩個(gè)數(shù)據(jù)源的數(shù)據(jù)進(jìn)行關(guān)聯(lián)(數(shù)據(jù)混合)?
- 2022-09-06 C#面向?qū)ο缶幊讨薪涌诟綦x原則的示例詳解_C#教程
- 2023-10-10 前端position: absolute是相對(duì)于誰(shuí)定位的?
- 2022-05-16 docker的具名掛載與匿名掛載實(shí)現(xiàn)_docker
- 2022-05-11 Redis之RedisTemplate配置方式(序列和反序列化)_Redis
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支