当前位置: 首页 > news >正文

【玩转python】入门篇day11-位运算

1、位运算语法

计算机中所有的数据都是以二进制的形式存储在设备中。即 0、1 两种状态,计算机对二进制数据进行的运算(+、-、、/)都是叫位运算,相比在代码中直接使用(+、-、、/)运算符,合理的运用位运算更能显著提高代码在机器上的执行效率。

举一个简单的例子来看下 CPU 是如何进行计算的,比如这行代码:
int a = 35;
int b = 47;
int c = a + b;

计算两个数的和,因为在计算机中都是以二进制来进行运算,所以上面我们所给的 int 变量会在机器内部先转换为二进制在进行相加:

35:  0 0 1 0 0 0 1 1
47:  0 0 1 0 1 1 1 1
————————————————————
82:  0 1 0 1 0 0 1 0

按位与(&):

  • 两个对应的位都是1时结果才为1,否则为0。
  • 示例:5 & 3 = 1(即 0101 & 0011 = 0001)

按位或(|):

  • 两个对应的位中只要有一个是1,结果就为1。
  • 示例:5 | 3 = 7(即 0101 | 0011 = 0111)

按位异或(^):

  • 两个对应的位不同则结果为1,相同则结果为0。
  • 示例:5 ^ 3 = 6(即 0101 ^ 0011 = 0110)

按位取反(~):

  • 将每个位上的1变成0,0变成1。
  • 示例:~5 = -6(在有符号整数中,二进制表示会有所不同,取决于补码表示法)

左移(<<):

  • 将所有位向左移动指定的位数,右边空出的位置用0填充。
  • 示例:5 << 1 = 10(即 0101 << 1 = 1010)

右移(>>):

  • 将所有位向右移动指定的位数,左边空出的位置根据整数是有符号还是无符号来填充0或原最高位的值。
  • 示例:5 >> 1 = 2(即 0101 >> 1 = 0010)

2、位运算常用场景

(1)交换两个数的值

交换ab的值,原理就是ab异或之后得到c 然后c和其中任意一位数异或得到另外一位

a:11011
b:10100
a = a ^ b # 第一次异或a变成两个数的结果,b没变 
b = b ^ a # b 异或他们的结果得到a
a = a ^ b 

(2)快速判断奇偶性

使用按位与运算可以快速判断一个整数是否为偶数。由于任何偶数的二进制表示最后一位都是0,而奇数最后一位是1,

  • 因此可以使用 n & 1 的结果来判断:
  • 如果结果为0,则n是偶数。
  • 如果结果为1,则n是奇数。

(3)判断整数是否为2的幂

一个正整数如果是2的幂,那么它在二进制表示中仅有一位为1,其余位都为0。例如,8(即1000)是2的幂。你可以通过将该数与其减1后的数做按位与运算来判断:

  • 如果 n & (n - 1) 的结果为0,并且n不为0,那么n是2的幂。

(4)实现快速乘法和除法

利用左移和右移运算可以实现快速的乘法和除法:

  • 左移一位相当于乘以2。
  • 右移一位相当于除以2。
http://www.lryc.cn/news/403429.html

相关文章:

  • 【Gitlab】记一次升级 Gitlab 后 API 失效的问题
  • 2024.7.19 作业
  • python如何创建SQLite 数据库连接,如何将数据库存储在内存中?
  • 机器学习-20-基于交互式web应用框架streamlit的基础使用教程
  • 基于luckysheet实现在线电子表格和Excel在线预览
  • 【学习笔记】无人机系统(UAS)的连接、识别和跟踪(一)-3GPP TS 23.256 技术规范概述
  • sqlalchemy_dm
  • 基于springboot+vue+uniapp的驾校预约平台小程序
  • echarts实现3d柱状效果
  • Flask校验
  • web前端 Vue 框架面试120题(一)
  • UniApp__微信小程序项目实战 实现长列表分页,通过 onReachBottom 方法上划分次加载数据
  • 数据结构(功能受限的表-栈队列)
  • 高数知识补充----矩阵、行列式、数学符号
  • 《Techporters架构搭建》-Day01 第一个RESTful API接口
  • 【C++ —— AVL树】
  • 跨平台webSocket模块设计技术解决方案
  • Drools规则引擎
  • vue学习day11-路由、路由模块的封装、声明式导航-路由的介绍、VueRouter、router-link、自定义高亮类名
  • 智慧校园学期基础数据管理
  • ISP代理和双ISP代理:区别和优势
  • 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【22】【RabbitMQ】
  • 概率论原理精解【4】
  • Linux云计算 |【第一阶段】ENGINEER-DAY3
  • springboot 实体类加注解校验入参数据
  • 关于 Qt输入法在arm特定的某些weston下出现调用崩溃 的解决方法
  • Android Studio关于Gradle及JDK问题解决
  • Leetcode 205. 同构字符串
  • 多口适配器,给您的生活增添便利
  • 探索现代Web开发:WebKit的剪贴板API革新