✨1.1.1 按位与运算替代求余运算优化场景
在计算机编程中,使用按位与运算(&)替代求余运算(%)可以提高效率的特殊场景是:当除数是 2 的整数次幂(即 ( b = 2^n ),其中 ( n ) 为自然数)时。例如,( b = 2, 4, 8, 16, 32, 64 ) 等。此时,求余运算 ( a % b ) 可以等价转换为按位与运算 ( a & (b - 1) )。下面我将详细解释原理、运算过程、效率优势及适用场景。
为什么这种等价成立?
● 数学原理:当 ( b = 2^n ) 时,求余运算 ( a % b ) 的本质是获取 ( a ) 的二进制表示中的最低 ( n ) 位。因为:
○ ( b = 2n ) 的二进制形式是 1 后跟 ( n ) 个 0(例如,( 16 = 24 ) 的二进制是 10000)。
○ ( a ) 除以 ( b ) 时,高位的值被 ( b ) 整除,余数只取决于最低 ( n ) 位。
● 位运算原理:
○ ( b - 1 ) 的二进制形式是 ( n ) 个 1(例如,( 16 - 1 = 15 ) 的二进制是 01111)。
○ 按位与运算 ( a & (b - 1) ) 会保留 ( a ) 的最低 ( n ) 位,而将高位清零,这正好等于余数。
● 公式:
[
a % (2n) = a & (2n - 1)
]
详细运算过程(以 ( a = 23 ), ( b = 16 ) 为例)
- 求余运算 ( 23 % 16 ):
○ ( 23 ) 的二进制:10111(假设 5 位表示)。
○ ( 16 ) 是 ( 2^4 ),所以求余是取最低 4 位。
○ 计算:( 23 \div 16 = 1 ) 余 ( 7 )(因为 ( 16 \times 1 = 16 ), ( 23 - 16 = 7 ))。
○ 结果:( 7 )。 - 按位与运算 ( 23 & (16 - 1) = 23 & 15 ):
○ ( 23 ) 的二进制:10111。
○ ( 15 ) 的二进制:01111(( 16 - 1 = 15 ),即 4 个 1)。
○ 按位与操作(逐位比较,同 1 则 1,否则 0):
23: 1 0 1 1 1
& 15: 0 1 1 1 1
0 0 1 1 1 → 二进制 `00111` = 十进制 7
○ 结果:( 7 ),与 ( 23 % 16 ) 相同。
关键点:
● 最低 4 位(0111)被保留,高位(10)被清零。
● 这等价于取 ( a ) 的二进制表示中的最低 ( n ) 位(这里 ( n = 4 ))。
为什么能提高效率?
- 硬件操作差异:
○ 求余运算 %:通常由 CPU 的除法指令实现,涉及多步计算(如减法、移位),开销较大(可能需要数十个时钟周期)。
○ 按位与运算 &:是 CPU 的单一指令,直接在位级别操作,通常只需 1 个时钟周期,速度极快。 - 优化效果:当 ( b ) 是 2 的次幂时,& 比 % 快 10 倍以上(具体取决于架构),尤其在循环或高频调用场景中(如哈希计算、位处理)。
适用场景举例 - 哈希表桶索引计算:
○ 如果桶大小 ( \text{size} = 2^n )(如 32、64),计算索引:index = hash % size → index = hash & (size - 1)。
○ 例如:hash = 123, size = 32(( 2^5 )),则 123 % 32 = 27 等价于 123 & 31 = 27。 - 位掩码提取:
○ 提取颜色值(如 RGB 中的低 8 位):blue = color & 0xFF(等价于 color % 256)。
○ 检查奇偶性:a % 2 → a & 1(因为 ( 2 = 2^1 ),b - 1 = 1)。 - 环形缓冲区或循环队列:
○ 当缓冲区大小为 2 的次幂时,索引回绕:next_index = (current + 1) % buffer_size → next_index = (current + 1) & (buffer_size - 1)。
注意事项
● 严格条件:仅当 ( b = 2^n ) 时成立!如果 ( b ) 不是 2 的次幂(如 ( b = 10 )),则不能直接用 & 替代(需其他方法,如查表或乘法)。
● 负数处理:在编程语言中,% 和 & 对负数的行为可能不同(如 -7 % 16 可能为 -7 或 9,取决于语言)。建议先确保 ( a ) 为非负数,或使用位掩码强制转换。
● 编译器优化:现代编译器(如 GCC、Clang)在 b 为常量 2 的次幂时,可能自动将 % 转换为 &,但显式使用可确保优化。
总结
● 场景:当除数是 ( 2^n ) 时,用 ( a & (b - 1) ) 替代 ( a % b )。
● 原因:位运算直接提取二进制低位,避免昂贵的除法。
● 效率:& 是 O(1) 操作,远快于 % 的 O(log a) 复杂度。
通过这种优化,可以在底层系统编程、游戏开发、嵌入式系统等对性能敏感的领域显著提升速度。
相关文章:
✨1.1.1 按位与运算替代求余运算优化场景
在计算机编程中,使用按位与运算(&)替代求余运算(%)可以提高效率的特殊场景是:当除数是 2 的整数次幂(即 ( b 2^n ),其中 ( n ) 为自然数)时。例如,( b …...

解决开发者技能差距:AI 在提升效率与技能培养中的作用
企业在开发者人才方面正面临双重挑战。一方面,IDC 预测,到2025年,全球全职开发者将短缺400万人;另一方面,一些行业巨头已暂停开发者招聘,转而倚重人工智能(AI)来满足开发需求。这不禁…...

XCTF-web-easyphp
解析 第一个条件( k e y 1 ): i s s e t ( key1):isset( key1):isset(a) && intval(KaTeX parse error: Expected EOF, got & at position 14: a) > 6000000 &̲& strl…...

Transformer 通关秘籍11:Word2Vec 及工具的使用
将文字文本转换为词向量(word embedding)的过程中,一个非常著名的算法模型应该就是 Word2Vec 了。 相信大家或多或少都听说过,本节就来简单介绍一下 Word2Vec 。 什么是 Word2Vec ? Word2Vec 可以非常有效的创建词嵌入向量&…...

【DAY34】GPU训练及类的call方法
内容来自浙大疏锦行python打卡训练营 浙大疏锦行 知识点: CPU性能的查看:看架构代际、核心数、线程数GPU性能的查看:看显存、看级别、看架构代际GPU训练的方法:数据和模型移动到GPU device上类的call方法:为什么定义前…...

Flutte ListView 列表组件
目录 1、垂直列表 1.1 实现用户中心的垂直列表 2、垂直图文列表 2.1 动态配置列表 2.2 for循环生成一个动态列表 2.3 ListView.builder配置列表 列表布局是我们项目开发中最常用的一种布局方式。Flutter中我们可以通过ListView来定义列表项,支持垂直和水平方向展示…...

muduo库的初步认识和基本使用,创建一个简单查询单词服务系统
小编在学习完muduo库之后,觉得对于初学者,muduo库还是有点不好理解,所以在此,小编来告诉大家muduo库的初步认识和基本使用,让初学者也可以更快的上手和使用muduo库。 Muduo由陈硕大佬开发,是⼀个基于 非阻塞…...
电脑如何保养才能用得更久
在这个数字化的时代,电脑已经成为了我们生活和工作中不可或缺的伙伴。无论是处理工作文档、追剧娱乐,还是进行创意设计,电脑都发挥着至关重要的作用。那么,如何让我们的电脑“健康长寿”,陪伴我们更久呢?今…...
Oracle的NVL函数
Oracle的NVL函数是一个常用的空值处理函数,主要用于在查询结果中将NULL值替换为指定的默认值。以下是关于NVL函数的详细说明: 基本语法 NVL(expr1, expr2) 如果expr1为NULL,则返回expr2如果expr1不为NULL,则返回expr1本身 …...

【HTML/CSS面经】
HTML/CSS面经 HTML1. script标签中的async和defer的区别2. H5新特性(1 标签语义化(2 表单功能增强(3 音频和视频标签(4 canvas和svg绘画(5 地理位置获取(6 元素拖动API(7 Web Worker(…...

git查看commit属于那个tag
1. 快速确认commit原始分支及合入tag # git describe 213b4b3bbef2771f7a1b8166f6e6989442ca67c8 查看commit合入tag # git describe 213b4b3bbef2771f7a1b8166f6e6989442ca67c8 --all 查看commit原始分支 2.查看分支与master关系 # git show --all 0.5.67_0006 --stat 以缩…...
如何从ISO镜像直接制作Docker容器基础镜像
引言 这段最值得总结的经验知识,就是如何在ISO镜像的基础上,直接做出docker base image,无需联网! 特别地,对于一些老旧OS系统,都能依此做出docker base image! 例如,某些老旧系统,CentOS 6,…...
网站缓存入门与实战:浏览器与Nginx/Apache服务器端缓存,让网站速度起飞!(2025)
更多服务器知识,尽在hostol.com 嘿,各位站长和网站管理员朋友们!咱们精心打造的网站,内容再好,设计再炫,如果用户打开它的时候,加载速度慢得像“老牛拉破车”,那体验可就大打折扣了…...

mysql-mysql源码本地调试
前言 先进行mysql源码本地编译:mysql源码本地编译 1.本地调试 这里以macbook为例 1.使用vscode打开mysql源码 2.创建basedir目录、数据目录、配置文件目录、配置文件 cd /Users/test/ mkdir mysqldir //创建数据目录和配置目录 cd mysqldir mkdir conf data …...

PCIe— Legacy PCI
Legacy Model 该器件通过将其引脚置位到控制器来生成中断。 在较旧的系统中,这个控制 器通常是Intel 8259 PIC,有15个IRQ输入和一个INTR输出。 然后,PIC将断 言INTR以通知CPU一个或多个中断正在挂起。 一旦CPU检测到INTR的断言…...

PostgreSQL数据库配置SSL操作说明书
背景: 因为postgresql或者mysql目前通过docker安装,只需要输入主机IP、用户名、密码即可访问成功,这样其实是不安全的,可能会通过一些手段获取到用户名密码导致数据被窃取。而ES、kafka等也是通过用户名/密码方式连接,…...
MySQL 的 super_read_only 和 read_only 参数
MySQL 的 super_read_only 和 read_only 参数 一、参数基本概念 1. read_only 参数 作用:控制普通用户是否只能读取数据影响范围:所有非SUPER权限的用户默认值:OFF(可读写) 2. super_read_only 参数 作用…...

低碳理念在道路工程中的应用-预制路面
一、引子 在上一篇文章里,给大家介绍了预制基层的应用,有人提出,既然基层能够预制,那么,道路面层能不能预制呢,有没有相关的研究成果和应用实例呢?答案是肯定的,在本篇文章中&#x…...

12-后端Web实战(登录认证)
在前面的课程中,我们已经实现了部门管理、员工管理的基本功能,但是大家会发现,我们并没有登录,就直接访问到了Tlias智能学习辅助系统的后台。 这是不安全的,所以我们今天的主题就是登录认证。最终要实现的效果是&#…...
TIDB创建索引失败 mkdir /tmp/tidb/tmp_ddl-4000/1370: no such file or directory.
TIDB创建索引失败:解决“mkdir /tmp/tidb/tmp_ddl-4000/1370: no such file or directory”问题 在使用 TIDB 数据库时,我们有时会遇到创建索引失败的问题。常见的错误信息为: mkdir /tmp/tidb/tmp_ddl-4000/1370: no such file or directo…...
Redis 插入中文乱码键
Java 代码: Bean// 静态代理模式: Redis 客户端代理类增强public StringRedisTemplateProxy stringRedisTemplateProxy(RedisKeySerializer redisKeySerializer,StringRedisTemplate stringRedisTemplate,RedissonClient redissonClient) {stringRedisTemplate.setK…...
Mac OS 使用说明
Mac 的启动组合键 了解可通过在启动时按住一个或多个按键来访问的 Mac 功能和工具。 若要使用这些组合键中的任何一个,请在按下电源按钮以开启 Mac 后或在 Mac 开始重新启动后,立即按住相应按键。请一直按住,直至电脑出现对应的行为。 !!!上…...

4.2.2 Spark SQL 默认数据源
在本实战概述中,我们探讨了如何在 Spark SQL 中使用 Parquet 格式作为默认数据源。首先,我们了解了 Parquet 文件的存储特性,包括其二进制存储方式和内嵌的 Schema 信息。接着,通过一系列命令,我们演示了如何在 HDFS 上…...

234. Palindrome Linked List
目录 一、题目描述 方法一、使用栈 方法二、将链表全部结点值复制到数组,再用双指针法 方法三、递归法逆序遍历链表 方法四、快慢指针反转链表 一、题目描述 234. Palindrome Linked List 方法一、使用栈 需要遍历两次。时间复杂度O(n),空间复杂度…...
广州邮科高频开关电源:以创新科技赋能通信能源绿色未来
在数字化浪潮席卷全球的当下,通信网络作为信息社会的基石,其稳定运行对电源系统的可靠性、效率及智能化水平提出了更高要求。作为国内通信电源领域的领军企业,广州邮科凭借其自主研发的高频开关电源技术,以高效节能、智能管控、绿…...
day41 python图像识别任务
目录 一、数据预处理:为模型打下坚实基础 二、模型构建:多层感知机的实现 三、训练过程:迭代优化与性能评估 四、测试结果:模型性能的最终检验 五、总结与展望 在深度学习的旅程中,多层感知机(MLP&…...

无人机报警器探测模块技术解析!
一、运行方式 1. 频谱监测与信号识别 全频段扫描:模块实时扫描900MHz、1.5GHz、2.4GHz、5.8GHz等无人机常用频段,覆盖遥控、图传及GPS导航信号。 多路分集技术:采用多传感器阵列,通过信号加权合并提升信噪比,…...
Docker 替换宿主与容器的映射端口和文件路径
在使用 Docker 容器化应用程序时,经常需要将宿主机的端口和文件路径映射到容器中,以便在本地访问容器中的服务和数据。本文将详细介绍如何替换和配置 Docker 容器的端口和文件路径映射。 1. 端口映射 端口映射用于将宿主机的端口转发到容器中的端口&am…...
我的3种AI写作节奏搭配模型,适合不同类型写作者
—不用内耗地高效写完一篇内容,原来可以这样搭配AI ✍️ 开场:为什么要“搭配节奏”写作? 很多人以为用AI写作,就是丢一句提示词,然后“等它写完”。 但你有没有遇到这些情况: AI写得很快,学境…...

Bonjour
Bonjour 是苹果的一套零配置网络协议,用于发现局域网内的其他设备并进行通信,比如发现打印机、手机、电视等。 一句话:发现局域网其他设备和让其他设备发现。 Bonjour 可以完成的工作 IP 获取名称解析搜索服务 实际应用场景示例࿰…...