【python】Python中位运算算法详细解析与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨
🎈🎈 养成好习惯,先赞后看哦~🎈🎈
🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,PyQt5和Tkinter桌面开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生K8S,linux,shell脚本等实操经验,网站搭建,数据库等分享。所属的专栏:python综合应用,基础语法到高阶实战教学
景天的主页:景天科技苑

文章目录
- Python中位运算的详细用法教程
- 一、位运算符简介
- 1.1 按位与(&)
- 1.2 按位或(|)
- 1.3 按位异或(^)
- 1.4 取反(~)
- 1.5 左移位(<<)
- 1.6 右移位(>>)
- 二、位运算的实际应用案例
- 2.1 快速判断奇偶性
- 2.2 交换两个数的值(不使用临时变量)
- 2.3 权限设置
- 2.4 图像处理
- 2.5 位掩码(Bitmask)
- 2.6 高效遍历
- 2.7 加密和哈希
- 三、总结
Python中位运算的详细用法教程
在Python中,位运算是一种对二进制数进行操作的运算方式,它们直接对二进制位进行操作,而不考虑这些位所表示的实际值。位运算因其高效性、节省空间以及逻辑清晰的特点,在网络编程、密码学、图形处理等领域有着广泛的应用。本文将详细介绍Python中的位运算符,包括按位与(&)、按位或(|)、按位异或(^)、取反(~)、左移位(<<)、右移位(>>)和无符号右移位(>>>,但注意Python中没有无符号右移运算符),并通过实际案例来展示它们的用法。
一、位运算符简介
1.1 按位与(&)
按位与运算符(&)用于将两个数的每个二进制位进行比较,如果两个相应位都为1,则该位为1;否则为0。这个运算符常用于提取指定位的信息、清零特定位等操作。
示例:
假设我们有两个二进制数0b1011和0b1100,我们可以使用按位与运算符来提取它们的共同位。
result = 0b1011 & 0b1100
print(bin(result)) # 输出: 0b1000
1.2 按位或(|)
按位或运算符(|)用于将两个数的每个二进制位进行比较,如果两个相应位中有一个为1,则该位为1;否则为0。这个运算符常用于设置特定位为1、将多个条件合并等。
示例:
同样以0b1011和0b1100为例,使用按位或运算符来将它们的对应位中的任何一个为1的位设置为1。
result = 0b1011 | 0b1100
print(bin(result)) # 输出: 0b1111
1.3 按位异或(^)
按位异或运算符(^)用于将两个数的每个二进制位进行比较,如果两个相应位不同,则该位为1;否则为0。这个运算符常用于二进制数据的加密、检查两个数是否相同等。
示例:
以0b1011和0b1100为例,使用按位异或运算符来检查它们的对应位是否相同。
result = 0b1011 ^ 0b1100
print(bin(result)) # 输出: 0b0111
1.4 取反(~)
取反运算符(~)用于将一个数的每个二进制位取反,即0变成1,1变成0。但需要注意的是,在Python中,对于有符号整数,取反操作实际上是对其补码进行取反,因此结果可能不是直观的。
示例:
假设我们有一个二进制数0b1010,我们可以使用取反运算符来对其进行取反操作。
num = 0b1010
result = ~num
print(bin(result)) # 输出可能不是直观的结果,因为Python使用补码表示负数
# 正确的理解应该是,先转换为补码,然后取反,得到的是该数的补码的相反数的补码
1.5 左移位(<<)
左移位运算符(<<)将数字的位向左移动指定的位数,高位丢弃,低位补0。这相当于乘以2的n次方。
示例:
将二进制数0b1010向左移动两位。
num = 0b1010
result = num << 2
print(bin(result)) # 输出: 0b101000
1.6 右移位(>>)
右移位运算符(>>)将数字的位向右移动指定的位数,低位丢弃,高位补0(对于正数)或者保持符号位不变(对于负数)。这相当于除以2的n次方。
示例:
将二进制数0b1010向右移动一位。
num = 0b1010
result = num >> 1
print(bin(result)) # 输出: 0b0101
二、位运算的实际应用案例
2.1 快速判断奇偶性
位运算可以用来快速判断一个整数是奇数还是偶数。由于任何整数的二进制表示中,最低位(即最右边的位)为1时表示该数为奇数,为0时表示该数为偶数,因此我们可以使用按位与运算符(&)与数字1进行运算来判断。
示例:
def is_odd(num):return num & 1 == 1def is_even(num):return num & 1 == 0# 测试
print(is_odd(5)) # 输出: True
print(is_even(4)) # 输出: True
2.2 交换两个数的值(不使用临时变量)
使用异或运算符(^)可以在不使用临时变量的情况下交换两个数的值。这种方法利用了异或运算的性质:任何数和0异或都等于它本身,任何数和其自身异或都等于0,且异或运算满足交换律和结合律。
示例:
def swap_numbers(a, b):a = a ^ bb = a ^ b # 此时b变为了原来的aa = a ^ b # 此时a变为了原来的breturn a, b# 测试
x, y = 5, 10
x, y = swap_numbers(x, y)
print(x, y) # 输出: 10 5
2.3 权限设置
在位运算中,一个常见的应用场景是权限管理。例如,在操作系统或应用程序中,可以使用位来表示不同的权限,并通过位运算来设置、检查或清除这些权限。
假设我们有以下权限定义:
- 权限1(0b0001)
- 权限2(0b0010)
- 权限3(0b0100)
- 权限4(0b1000)
示例:
# 权限定义
PERMISSION_1 = 0b0001
PERMISSION_2 = 0b0010
PERMISSION_3 = 0b0100
PERMISSION_4 = 0b1000# 用户权限
user_permissions = 0b0110 # 用户具有权限2和权限3# 检查权限
def has_permission(permissions, permission):return (permissions & permission) == permission# 设置权限
def set_permission(permissions, permission):return permissions | permission# 清除权限
def clear_permission(permissions, permission):return permissions & (~permission)# 测试
print(has_permission(user_permissions, PERMISSION_1)) # 输出: False
print(has_permission(user_permissions, PERMISSION_2)) # 输出: Truenew_permissions = set_permission(user_permissions, PERMISSION_1)
print(bin(new_permissions)) # 输出: 0b0111,现在用户有了权限1new_permissions = clear_permission(new_permissions, PERMISSION_2)
print(bin(new_permissions)) # 输出: 0b0101,现在用户没有了权限2
2.4 图像处理
在图像处理中,位运算可以用来实现各种效果,如图像的合并、分离、翻转等。虽然Python本身不是图像处理的首选语言(通常使用如OpenCV、PIL等库),但位运算的概念在底层图像处理算法中仍然非常重要。
示例(简化版):
假设我们有两个简单的图像(以二进制形式表示),我们可以使用位运算来合并它们。这里为了简化,我们使用两个简单的二进制字符串来表示图像。
# 假设有两个简单的二进制图像
image1 = "00110011"
image2 = "11001100"# 使用按位或合并图像(模拟“或”操作下的图像合并)
merged_image = ""
for i, j in zip(image1, image2):merged_image += bin(int(i, 2) | int(j, 2))[2:].zfill(2)print(merged_image) # 输出: 11111111# 注意:这里的示例非常简化,实际图像处理中需要考虑更多的因素,如图像尺寸、颜色深度等。
2.5 位掩码(Bitmask)
位掩码是位运算中一个非常有用的概念,它通常用于在单个整数中存储多个布尔值(或状态),每个布尔值占据一个位。通过位掩码,我们可以轻松地设置、检查或清除这些布尔值,而无需使用多个单独的变量。
示例:
假设我们有一个表示一周中每天是否开门的位掩码。我们可以这样定义它:
- 星期一:0b00000001
- 星期二:0b00000010
- 星期三:0b00000100
- 星期四:0b00001000
- 星期五:0b00010000
- 星期六:0b00100000
- 星期日:0b01000000
# 定义位掩码
MONDAY = 0b00000001
TUESDAY = 0b00000010
WEDNESDAY = 0b00000100
THURSDAY = 0b00001000
FRIDAY = 0b00010000
SATURDAY = 0b00100000
SUNDAY = 0b01000000# 假设某商店的开门日
open_days = MONDAY | WEDNESDAY | FRIDAY | SATURDAY# 检查是否开门
def is_open(days, day_mask):return (days & day_mask) == day_mask# 测试
print(is_open(open_days, MONDAY)) # 输出: True
print(is_open(open_days, TUESDAY)) # 输出: False# 设置或清除开门日
def set_open_day(days, day_mask, is_open):if is_open:return days | day_maskelse:return days & (~day_mask)# 示例:增加星期二的开门日
open_days = set_open_day(open_days, TUESDAY, True)
print(bin(open_days)) # 输出中应包含TUESDAY的位# 示例:关闭星期日的开门日
open_days = set_open_day(open_days, SUNDAY, False)
print(bin(open_days)) # 输出中不应包含SUNDAY的位
2.6 高效遍历
在某些特定情况下,位运算可以用来实现更高效的遍历或搜索算法。虽然这不是位运算最常见的应用场景,但在处理大量数据时,位运算可以显著减少内存使用和提高执行速度。
例如,在处理集合或列表时,如果元素数量有限且已知,我们可以使用位向量(bit vector)来存储元素的存在性。每个元素对应一个位,如果该位为1,则表示该元素存在;如果该位为0,则表示该元素不存在。
2.7 加密和哈希
虽然现代加密和哈希算法远比简单的位运算复杂得多,但位运算仍然是它们实现中的一个基础组成部分。例如,在一些简单的加密算法中,可能会使用位运算来混淆或置换数据的位。
哈希函数也经常使用位运算来提高其效率和均匀性。例如,它们可能通过位旋转、位反转或位混合等技术来确保哈希值的良好分布。
三、总结
位运算在Python中是一个强大而灵活的工具,尽管Python的高级特性使得它在许多情况下不是处理位运算的首选语言,但了解并掌握位运算的概念和技巧仍然是非常有价值的。通过本文的详细介绍和实际应用案例,希望读者能够更深入地理解Python中的位运算符,并在需要时能够灵活运用它们来解决问题。无论是在性能敏感的应用程序中优化代码,还是在需要直接操作二进制数据的场景中,位运算都提供了一种强大而直接的方法。
相关文章:
【python】Python中位运算算法详细解析与应用实战
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...
vba 保存word里面的图片_1分钟批量处理100张图片,有Word在
天下苦Word久矣!Word不仅是个码字工具,还是个排版工具,而Word在排版方面经常遇到的问题,恐怕说个三天三夜都说不完! 好不容易做完了100页的活动方案,交到处女座上司那里,他告诉我:“…...
Android进阶之路 - 字体加粗,定制化字体粗度
在客户端中不论是PC端,还是移动端主要价值之一就体现在用户交互方面,也就是用户体验了,接下来讲的是很常见的字体加粗问题 UI大找茬 深入浅出字体、字体库TextView文本渐变字体阴影、文字阴影字体加粗 - 定制化字体粗度 在开发中经常会遇到…...
ForkJoin框架的解析
Java 的 Fork/Join 框架是 Java 7 中引入的一种强大并发框架,旨在简化多线程编程,特别是对那些可以被递归地拆分成更小任务的任务。Fork/Join 框架的核心思想是将大任务拆分为多个小任务,并行运行这些小任务,然后将结果合并起来得…...
使用IDEA2019.1.4创建“hello world”java程序
使用IDEA创建“hello world”java程序分为4步: 创建工程->创建模块->创建库->创建类 1.创建工程 修改工程名称及地址 上步骤点击finish后,2019.1.4版本会自动弹出创建模块的窗口 2.创建模块 可以在上述窗口的基础上创建模块,也可…...
学习vue3 五,传送,缓存组件以及过渡和过渡列表
目录 Teleport传送组件 keep-alive缓存组件 transition动画组件 1. 过渡的类名 2. 自定义过渡class名 3. transition的生命周期 4.appear transition-group 1. 过渡列表 2. 列表的移动过渡 3. 状态过渡 Teleport传送组件 Teleport Vue 3.0新特性之一。 Teleport 是一…...
MyBatis快速学习
目录 前言 MyBatis的具体使用 一些小工具:MyBatisX 常见问题: 1.表中字段名和实体属性名不一致 2.按条件查询(单条件)时的,查询条件怎么编写 3.按条件查询(多条件) 4.多条件查询时&…...
24.8.3数据结构|双向循环链表、静态链表
双向循环链表 节点类型与双链表的节点类型完全相同双向循环链表的操作也与双链表的操作基本一致。 例题 将自然数一到N按由小到大的顺序沿顺时针方向围成一个圈,然后以一为起点先沿顺时针方向数到第N个数将其划去,再沿逆时针方向数到第K个数将其滑去&a…...
C语言典型例题28
《C程序设计教程(第四版)——谭浩强》 习题2.5 输入一个华氏温度,要求输出摄氏温度。公式为C5/9(F-32),要求输出要有文字说明,取两位小数 数学知识: (1)华氏温度与摄氏温度&#x…...
PHP企业培训考试系统小程序源码
🚀企业培训考试系统,赋能员工成长新引擎📚 🌱 开篇:解锁企业培训新篇章 在快速变化的商业环境中,员工的能力提升是企业持续发展的关键。🚀 传统的培训方式已难以满足现代企业的需求࿰…...
进程状态(三)----- linux 中具体的进程状态(下)
目录 前言1. T && t 状态2. X 与 Z 状态3. 孤儿进程 前言 继上一篇文章 进程状态(二)----- linux 中具体的进程状态(上) 介绍了 linux 系统中具体的 R、S、D 状态,而这篇文章继续介绍 linux 系统中剩下的三种…...
关系型数据库(RDBMS,Relational Database Management System)
关系型数据库(RDBMS,Relational Database Management System)是一种结构化数据存储系统,它使用表(Tables)、行(Rows)和列(Columns)的结构来组织和管理数据。关…...
使用RK Docker环境编译RK SDK
文章目录 前言Docker介绍实验环境获取RK Docker镜像加载RK Docker镜像使用RK Docker环境编译SDK其它 前言 作为一名嵌入式Linux的学习者,目前编译各种平台,用的都是同一个编译机(Ubuntu虚拟机)。之前一直在折腾全志,所…...
免费【2024】springboot 付费自习室管理系统的设计与实现
博主介绍:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围:SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化…...
【学习方法】高效学习因素 ② ( 学习动机 | 内在学习动机 | 外在学习动机 | 外在学习动机的调整方向 | 保护学习兴趣 | 高考竞争分析 )
文章目录 一、高效学习的其它因素 - 学习动机1、学习动机2、内在学习动机3、外在学习动机4、外在学习动机的问题所在5、外在学习动机的调整方向6、保护学习兴趣7、高考竞争分析 上一篇博客 【学习方法】高效学习因素 ① ( 开始学习 | 高效学习因素五大因素 | 高效学习公式 - 学…...
【学习笔记】A2X通信的协议(四)- A2X PC5通信(二)
目录 6.1.2.4 A2X PC5单播链接释放程序 6.1.2.4.1 概述 6.1.2.4.2 发起UE启动A2X PC5单播链接释放程序 6.1.2.4.3 目标UE接受的A2X PC5单播链接释放程序 6.1.2.4.4 发起UE完成的A2X PC5单播链接释放程序 6.1.2.4.5 异常情况 6.1.2.4.5.1 发起UE的异常情况 6.1.2.5 A2X …...
注意!!可能这是《网络管理员》旧教程最后一次考试,赶紧学起来
网络管理员是软考初级资格热门科目之一。近日在国家版本数据中心,小编查到网络管理员官方教程已经有2024最新版出来了,现在这一版教程说实话有些内容已经过时了,尤其新版教材也已经出现,小编推测明年大概率依据新版考试大纲出题&a…...
array postgre gsql 剔除
进行某种过滤或比较操作,判断不匹配的,数组 array 中列出的所有字符串 and a.Repunittree not like all (array[‘%0001003549950003%’,‘%000100460041%’,‘%000100460047%’,‘%000105880001%’ ,‘%000100020007%’,‘%000105830009%’,‘%0001058…...
【Matlab】零阶保持法:连续状态空间方程(含噪声,非线性)离散化处理方法
常用的离散化方法:零阶保持器(zero-order hold,ZOH)、欧拉法(Euler)、一阶保持器(First-order hold,FOH)。最常用的是前两种。 0.零阶保持器(ZOH)…...
web自动化6-pytest⑦一些基本情况
命名规则 1)import pytest 测试文件名要以test_ 开头或 _test结尾 2)类名需要以Test开头(T),不能带有init方法 3)函数名以test_开头(t) 符合规则框架才能找到用例,一条用例代表一条函…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...
基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL
ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...
