【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。这个运算符常用于提取指定位的信息、清零特定位等操作。

示例
假设我们有两个二进制数0b10110b1100,我们可以使用按位与运算符来提取它们的共同位。

result = 0b1011 & 0b1100
print(bin(result))  # 输出: 0b1000

1.2 按位或(|)

按位或运算符(|)用于将两个数的每个二进制位进行比较,如果两个相应位中有一个为1,则该位为1;否则为0。这个运算符常用于设置特定位为1、将多个条件合并等。

示例
同样以0b10110b1100为例,使用按位或运算符来将它们的对应位中的任何一个为1的位设置为1。

result = 0b1011 | 0b1100
print(bin(result))  # 输出: 0b1111

1.3 按位异或(^)

按位异或运算符(^)用于将两个数的每个二进制位进行比较,如果两个相应位不同,则该位为1;否则为0。这个运算符常用于二进制数据的加密、检查两个数是否相同等。

示例
0b10110b1100为例,使用按位异或运算符来检查它们的对应位是否相同。

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中的位运算符,并在需要时能够灵活运用它们来解决问题。无论是在性能敏感的应用程序中优化代码,还是在需要直接操作二进制数据的场景中,位运算都提供了一种强大而直接的方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/393775.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库扩展新篇章:主流分库分表中间件全解析

摘要&#xff1a; 随着企业数据量的激增&#xff0c;传统的单体数据库架构已经无法满足日益增长的性能需求和数据管理复杂性。分库分表技术作为解决这一问题的有效手段&#xff0c;通过将数据水平或垂直地分散到多个数据库中&#xff0c;提高了系统的扩展性和处理能力。本文将详…

LISA: Reasoning Segmentation via Large Language Model

发表时间&#xff1a;CVPR 2024 论文链接&#xff1a;https://openaccess.thecvf.com/content/CVPR2024/papers/Lai_LISA_Reasoning_Segmentation_via_Large_Language_Model_CVPR_2024_paper.pdf 作者单位&#xff1a;CUHK Motivation&#xff1a;尽管感知系统近年来取得了显…

鸡舍环控系统

在现代养殖业中&#xff0c;科技的进步正悄然改变着传统模式&#xff0c;其中&#xff0c;基于物联网和自动控制技术的鸡舍环控系统正逐渐成为行业内的新宠。这套系统不仅能够集成温湿度、光照度等参数的监测与控制&#xff0c;还能通过智能化手段减轻日常养殖工作量&#xff0…

探索 Python 异步通信的奥秘:WebSockets 库的神奇之旅

文章目录 探索 Python 异步通信的奥秘&#xff1a;WebSockets 库的神奇之旅背景&#xff1a;为何选择 WebSockets&#xff1f;什么是 websockets 库&#xff1f;安装 websockets 库5个简单的库函数使用方法场景应用示例常见问题与解决方案总结 探索 Python 异步通信的奥秘&…

sqli-labs-php7-master\Less-1

1&#xff0c;进入mysql数据库 mysql -u root -p 接着&#xff1a; show databases; use security; select * from where id1 LIMIT 0,1; 函数的基本用法 system_user() #当前系统用户 user() #当前登录用户 current_user() #当前登录用…

electron-updater实现electron全量更新和增量更新——主进程部分

同学们可以私信我加入学习群&#xff01; 正文开始 前言更新功能所有文章汇总一、更新插件选择二、在main.js中引入我们的更新模块三、更新模块UpdateController.js暴露的方法checkUpdate四、更新模块UpdateController.js中的监听4.1监听是否有新版本需要更新&#xff1f;4.2 监…

怎样配置虚拟机IP

目录&#xff08;三步走&#xff09; 配置本机IP 配置虚拟机外部IP 配置虚拟机内部IP 参考链接&#xff1a; 配置本机IP 打开“网络和共享中心”——>更改“适配器设置” 找到“VMnet8”&#xff0c;然后右键“属性”&#xff0c;弹出下列窗口 输入本机IP&#xff08;你…

浅谈操作系统

我们前面谈到了一个可执行程序首先会到内存进行预先加载~而在我们的计算机中第一个被加载的软件就是操作系统~ 操作系统的主要工作就是对软硬件资源进行管理~ 这里我们先从操作系统下层开始讲起~ 我们把操作系统类比为校长&#xff0c;驱动程序类比为辅导员&#xff0c;底层硬件…

【学术会议征稿】第四届电气工程与计算机技术国际学术会议(ICEECT2024)

第四届电气工程与计算机技术国际学术会议&#xff08;ICEECT2024&#xff09; 2024 4th International Conference on Electrical Engineering and Computer Technology 第四届电气工程与计算机技术国际学术会议&#xff08;ICEECT2024&#xff09;将于9月27日-29日在哈尔滨举…

吴恩达机器学习COURSE1 WEEK2

COURSE1 WEEK2 多维特征 在线性回归中&#xff0c;往往特征不止一个&#xff0c;而是具有多维特征 例如&#xff0c;在预测房价的例子中&#xff0c;我们知道更多的信息&#xff1a; x 1 x_1 x1​&#xff1a;房屋的面积 x 2 x_2 x2​&#xff1a;卧室的数目 x 3 x_3 x3​&a…

微信小程序 - 自定义计数器 - 优化(键盘输入校验)

微信小程序通过自定义组件&#xff0c;实现计数器值的增加、减少、清零、最大最小值限定、禁用等操作。通过按钮事件触发方式&#xff0c;更新计数器的值&#xff0c;并修改相关联的其它变量。通过提升用户体验&#xff0c;对计数器进行优化设计&#xff0c;使用户操作更加便捷…

蜂窝网络架构

2G/3G 4G eNB RF-RRU eCPRI RRU-BBU 光纤 5G From 38.300 AMF处理信令等&#xff0c;UPF 用户面&#xff0c;后面还有SMF

医院不良事件监测预警上报系统,PHP不良事件管理系统源码

不良事件上报系统&#xff0c;支持医院进行10大类医疗安全&#xff08;不良&#xff09;事件的上报管理&#xff1b;帮助医院管理部门更好把控不良事件的发生趋势&#xff0c;分析医院内部潜在的问题和风险&#xff0c;采取适当的管理措施&#xff0c;有效加强质量控制&#xf…

MySQL总体功能

基于Innodb存储引擎的讨论 MySQL 核心功能 功能解决的问题ACID模型数据并发访问&#xff0c;和奔溃恢复安全问题,一致性&奔溃恢复索引数据查询效率问题备份容错设计,解决硬件错误带来的问题复制数据迁移监控执行数据库操作的异常记录

JavaEE: wait(等待) / notify (通知)

文章目录 wait(等待) / notify (通知)总结 wait(等待) / notify (通知) 线程在操作系统上的调度是随机的~ 那么我们想要控制线程之间执行某个逻辑的先后顺序,那该咋办呢? 可以让后执行的逻辑,使用wait, 先执行的线程,在完成某些逻辑之后,通过notify来唤醒对应的wait. 另外,通…

C++-类与对象基础

一&#xff0c;类的定义 1.1类定义格式 class为定义类的关键字&#xff0c;Stack为类的名字&#xff0c;{}中为类的主体&#xff0c;注意类定义结束时后面分号不能省略。类体中内容称为mian类的成员&#xff1a;类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者…

【nginx】centos7安装并配置开机自启

【nginx】配置开机自启 1.nginx配置开机自启 安装完成nginx之后 vim /lib/systemd/system/nginx.service[Unit] Descriptionnginx Afternetwork.target[Service] Typeforking ExecStart/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf ExecReload/usr/loc…

理解Spring框架2:容器IOC

理解Spring框架2&#xff1a;容器IOC (qq.com)

ViP-LLaVA: Making Large Multimodal Models Understand Arbitrary Visual Prompts

发表时间&#xff1a;cvpr2024 论文链接&#xff1a;https://readpaper.com/pdf-annotate/note?pdfId2357936887983293952&noteId2426262228488986112 作者单位&#xff1a;University of Wisconsin–Madison Motivation&#xff1a;现在的多模态模型都关注整张图像的理…

torch量化接口深度解读-eager模式-fx模式

一、定义 接口总结量化模式解读 二、实现 接口总结 1. PyTorch提供了三种不同的量化模式&#xff1a;Eager模式量化、FX图模式量化&#xff08;维护&#xff09;和PyTorch 2导出量化。 2. Eager Mode Quantization是一个测试版功能。用户需要进行融合&#xff0c;并手动指定量…