几个正整数常用的位运算操作
位运算在高性能计算、资源敏感型场景(如嵌入式系统)、特定算法(加密、压缩)中具有不可替代的优势。合理使用位运算可以显著提升代码效率和资源利用率。
1. 判断一个正整数是否为8的倍数
bool is_multiple_of_eight(int n) {if (n <= 0) return false;return ((n & 7) == 0);
}
原理分析:
判断一个正整数是否为 8 的倍数,可以看这个数除以 8 是否余 0。8 = 2³,一个正整数如果是8的倍数,从二进制角度看,需要左移三位,即它的二进制形式最后 3 位一定是 0。因为 7 的二进制是 111,当 n & 7 时,实际上是检查 n 的二进制最后 3 位是否全为 0。
典型应用场景:
检查指针是否是 8 字节对齐。
为何要地址对齐:
- 某些 CPU 指令(如 SIMD)或数据结构(如原子操作)要求内存地址按特定对齐方式访问,否则可能导致性能下降或崩溃
- 例如,8 字节对齐的数据在 64 位系统中能通过单次内存操作高效读取
代码示例:
if ((reinterpret_cast<uintptr_t>(ptr) & 7) == 0u)
2. 判断一个正整数是否某个正整数的倍数
2为1的扩展,为更一般的情况
id & (kInc - 1) == 0
判断id是否为kInc的整数倍,但需满足一个关键前提:kInc必须是 2 的整数次幂(如 2, 4, 8, 16 等)。
原理分析:
前提条件:kInc是2的幂
若kInc是 2 的幂(如 kInc = 8),则 kInc - 1的二进制形式为低位全 1(例如 8 - 1 = 7,二进制为0b0111)。此时:
-
id & (kInc - 1) 等价于 id % kInc(位运算优化取模)
-
若结果为0,说明id是 kInc的整数倍
假设kInc = 8(即2³):
-
kInc - 1 = 7,二进制为 0b0000
...
0111。 -
id & 7会提取id的最低3位
-
若结果为0,说明这3位全为 0,即id是8的倍数
当kInc是 2 的幂时:
-
id & (kInc - 1)
-
例如:id = 16, kInc = 8 -> 16 % 8 = 0,条件成立
典型应用场景:
内存对齐检测:若 kInc 表示内存对齐粒度(如 64 字节),可快速判断地址是否对齐。
循环缓冲区索引回绕:当索引达到缓冲区大小的整数倍时触发重置。
周期性任务调度:每处理 kInc 个元素时执行特定操作
代码示例:
constexpr size_t kInc = 64; // 2⁶ = 64
uint64_t id = 0;for (int i = 0; i < 200; ++i, ++id) {if ((id & (kInc - 1)) == 0) {// 当 id = 0, 64, 128, 192... 时触发std::cout << "Aligned at id=" << id << std::endl;}
}
// 输出: Aligned at id=0, 64, 128, 192
3. 将一个正整数向上对齐到最近的8的倍数
(n + 7) & static_cast<size_t>(-8)
原理分析
-
static_cast<size_t>(-8) 的二进制形式为低 3 位全 0,其余位全 1(例如在 64 位系统中为0xFFFFFFFFFFFFFFF8)
-
n + 7的目的是将n调整到“超过或等于当前值”的候选对齐点
-
按位与操作&会清零低 3 位,将结果向下舍入到最近的 8 的倍数。但由于先加了 7,实际效果是向上对齐。
典型应用场景:
内存对齐:确保地址或内存块大小是 8 字节对齐(如 SIMD 指令、缓存行优化)
资源分配:分配整数倍大小的资源(如 GPU 纹理、网络数据包)
循环步长控制:按固定对齐步长处理数据
代码示例:
size_t align_up_to_8(size_t n) {return (n + 7) & static_cast<size_t>(-8);
}int main() {std::cout << align_up_to_8(1) << std::endl; // 输出 8std::cout << align_up_to_8(7) << std::endl; // 输出 8std::cout << align_up_to_8(8) << std::endl; // 输出 8std::cout << align_up_to_8(9) << std::endl; // 输出 16return 0;
}
若需对齐到其他 2 的幂(如 16、32),只需调整偏移量和掩码:
// 对齐到 16 的倍数
size_t align_up_to_16(size_t n) {return (n + 15) & static_cast<size_t>(-16);
}
4. 将一个正整数向下对齐到最近的8的倍数
n & (-8)
原理分析:
-
-8 的二进制形式:在补码表示中,-8 的二进制为 0xFFFF...FFF8(低 3 位全 0,其他位全 1)
-
按位与操作&:n & (-8) 会清零 n 的低 3 位,保留其他高位不变,相当于将 n 向下舍入到最近的 8 的倍数
典型应用场景:
内存地址对齐:获取当前地址所在的 8 字节对齐块起始位置(如内存池管理)。
资源块分配:计算资源(如显存、缓冲区)的块起始索引。
高效取模运算:替代 n % 8(需额外处理符号位
代码示例:
#include <iostream>size_t align_down_to_8(size_t n) {return n & static_cast<size_t>(-8);
}int main() {std::cout << align_down_to_8(7) << std::endl; // 输出 0std::cout << align_down_to_8(9) << std::endl; // 输出 8std::cout << align_down_to_8(15) << std::endl; // 输出 8std::cout << align_down_to_8(16) << std::endl; // 输出 16return 0;
}
若需对齐到其他 2 的幂(如 16、32),只需调整掩码:
// 对齐到 16 的倍数
size_t align_down_to_16(size_t n) {return n & static_cast<size_t>(-16);
}
相关文章:
几个正整数常用的位运算操作
位运算在高性能计算、资源敏感型场景(如嵌入式系统)、特定算法(加密、压缩)中具有不可替代的优势。合理使用位运算可以显著提升代码效率和资源利用率。 1. 判断一个正整数是否为8的倍数 bool is_multiple_of_eight(int n) {if (…...
消息队列(MQ)在项目中的使用场景详解【附开发实战思路】
在开发中,很多人一开始对消息队列(MQ)的认识仅限于“异步处理”,但随着项目复杂度提升,我们会发现 MQ 不仅能异步处理任务,还能解耦系统、削峰限流,甚至提高整体架构的稳定性和扩展性。 这篇文…...
基于MATLAB-GUI图形界面的数字图像处理
基于MATLAB GUI的数字图像处理系统实现方案,包含常见图像处理功能。代码分为两部分:GUI界面设计和回调函数实现。 %% 第一部分:创建GUI界面 (使用GUIDE) % 1. 打开GUIDE: guide % 2. 创建新GUI,添加以下控件: % - …...
C语言水仙花数
水仙花数(Narcissistic Number)也被称为自幂数,是数学中的一种特殊三位数,属于自幂数的一种类型。它的定义为:一个三位数,其各位数字的立方和等于该数本身。 具体定义与计算方式条件: 设一个三位…...
前k个高频元素
pair<int int>:用于存储两个数字。(pair<int string>用于存储一个整数和一个字符串) const pair<int int>:表示pair对象是常量,一旦初始化以后,其内部的两个成员值都不能被修改。 bool…...
人工智能与智能的底色都是哲学
人工智能与智能的底色都是哲学,因为哲学为它们提供了对“智能”本质的追问与思考。哲学自古以来便对人类智能、思维与意识进行深入探讨,为理解智能的结构和功能奠定了基础。同时,人工智能的发展也引发了诸多哲学问题,如伦理道德、…...
能碳管理系统:助力企业实现“双碳“目标
在全球气候治理和绿色低碳发展的大背景下,能碳管理系统正成为企业应对气候变化、实现"碳达峰、碳中和"战略目标的核心工具。这一系统通过数字化手段将能源管理与碳排放管控深度融合,为企业低碳转型提供全方位支持。 一、系统架构与核心技术 …...
开源鸿蒙北向源码开发: 5.0kit化相关sdk编译
5.0kit化可以在编译系统sdk时添加,将你的kit文件加入编译使得最终生成的sdk包含kits文件 修改编译脚本 修改build仓里面的构建脚本文件,添加kits目录脚本命令 社区的build脚本已经有kits编译功能了,只需要把你的kits目录新增的kit拷贝到社区仓interface仓了,和社区的都一起编…...
多通道电源管理芯片在分布式能源系统中的优化策略
摘要:随着分布式能源系统的广泛应用,对电源管理芯片的性能要求日益提升。本文深入探讨了多通道电源管理芯片在分布式能源系统中的优化策略,以国科安芯的ASP4644芯片为例,从电气特性、工作模式、热管理、可靠性设计以及系统集成为主…...
IEEE 列表会议第五届机器人、自动化与智能控制国际会议
会议地点:中国 成都 会议官网:ICRAIC 主办单位:成都理工大学 协办单位:成都大学 早鸟截稿:2025年7月15日 截稿时间:2025年8月20日 出版信息:IEEE出版&EI数据库 会议时间:…...
GitHub 趋势日报 (2025年05月15日)
本日报由 TrendForge 系统生成 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日整体趋势 Top 10 排名项目名称项目描述今日获星总星数语言1TapXWorld/ChinaTextbookPDF教材。⭐ 6685⭐ 15287Roff2xming521/WeClone&…...
Java 并发编程归纳总结(可重入锁 | JMM | synchronized 实现原理)
1、锁的可重入 一个不可重入的锁,抢占该锁的方法递归调用自己,或者两个持有该锁的方法之间发生调用,都会发生死锁。以之前实现的显式独占锁为例,在递归调用时会发生死锁: public class MyLock implements Lock {/* 仅…...
Git 笔记
设置Git的user name和email $ git config --global user.name "bread" $ git config --global user.email "1234567890qq.com"因为Git是分布式版本控制系统,所以需要填写用户名和邮箱作为一个标识。git config --global 参数,有了这…...
蒟蒻编程日志
ORZ (用于记录你这个“人”是不是真的,也就是说CSDN的流量是否属合适) 2025/4/14 21:25 开坑 前言 2024/10/26:CSP-J 260pts,CSP-S 45pts。 2025/3/1:%你赛 180pts rk34 寄!这就是不认真的…...
深入GoFrame框架:GToken的优势、实践与踩坑经验分享
一、引言 近年来,Go语言凭借其简洁的语法、高并发性能和强大的标准库,在后端开发领域迅速崛起。从微服务到企业级应用,Go的生态圈正在蓬勃发展,吸引了越来越多的开发者投入其中。在这个生态中,框架的选择往往决定了项…...
MODBUS RTU调试助手使用方法详解
一、软件简介 485调试助手是一款常用的串口通信调试工具,专门用于RS-485总线设备的测试、调试和通信监控。它支持多种串口参数设置,提供数据收发功能,是工业现场调试的必备工具之一。 二、软件安装与启动 1. 系统要求 Windows 7/10/11操作…...
【专利信息服务平台-注册/登录安全分析报告】
前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…...
我用 Appuploader绕过 Mac,成功把 iOS 应用上线了 App Store
我以前总觉得,iOS 上架是 macOS Xcode 专属的领域。直到最近项目必须要上架 iOS,团队却没人用 Mac,只能临时组建了一套“跨平台上架流程”。 这篇文章记录我这个“非典型 iOS 开发者”是如何绕开传统 Xcode 流程,借助一系列工具…...
Mac上安装运行SynthTIGER
1. 确保已安装 Python 环境 SynthTIGER 需要 Python 3.6。如果你的 Mac 没有安装 Python: 推荐通过 Homebrew 安装: brew install python 或从 Python 官网 下载安装。 验证安装: python3 --version pip3 --version 2. 安装 SynthTIGER…...
从代码学习深度学习 - 实战Kaggle比赛:狗的品种识别(ImageNet Dogs)PyTorch版
文章目录 前言1. 获取和整理数据集1.1 读取标签1.2 整理数据集:划分训练集和验证集1.3 整理测试集1.4 执行数据重组 2. 图像增广3. 读取数据集3.1 创建Dataset实例3.2 创建DataLoader实例 4. 微调预训练模型4.1 定义网络结构4.2 定义损失函数和评估函数 5. 定义训练…...
翼兴消防监控 – 大数据可视化HTML源码
概述 在当今数据驱动的时代,大数据可视化已成为各行各业不可或缺的工具。幽络源今天为大家带来一款基于ECharts的消防监控大屏HTML源码,帮助开发者快速搭建专业级数据展示界面。这款源码设计简洁大方,功能完善,适合各类监控场景使…...
搭建运行若依微服务版本ruoyi-cloud最新教程
搭建运行若依微服务版本ruoyi-cloud 一、环境准备 JDK > 1.8MySQL > 5.7Maven > 3.0Node > 12Redis > 3 二、后端 2.1数据库准备 在navicat上创建数据库ry-seata、ry-config、ry-cloud运行SQL文件ry_20250425.sql、ry_config_20250224.sql、ry_seata_2021012…...
火山引擎AI大模型
火山引擎的AI大模型(如**“云雀”大模型**)作为字节跳动旗下的核心技术产品,在性能、应用场景和技术生态上表现较为突出,尤其在字节自身业务(如抖音、TikTok等)的打磨下,具备较强的实用性和行业…...
isaacgym环境安装
1. 系统环境 操作系统:Ubuntu 18.04.6 LTSGPU:NVIDIA TITAN RTXDriver 版本: 510.108.03CUDA 版本:11.6 2. conda安装以及环境安装 略过(参考内容:https://github.com/unitreerobotics/unitree_rl_gym/blob/main/doc…...
使用Mathematica制作Lorenz吸引子的轨道追踪视频
Lorenz奇异吸引子是混沌理论中最早被发现和研究的吸引子之一,它由Edward Lorenz在1963年研究确定性非周期流时提出。Lorenz吸引子以其独特的"蝴蝶"形状而闻名,是混沌系统和非线性动力学的经典例子。 L NDSolveValue[{x[t] -3 (x[t] - y[t]),…...
基于matlab的D2D 功率控制仿真
基于MATLAB的D2D(Device-to-Device)功率控制仿真示例,包含系统建模、功率控制算法实现和性能分析。该仿真以蜂窝网络为背景,重点关注D2D用户间的干扰管理和功率优化。 1. 系统模型与参数设置 clc; clear; close all;%% 参数配置…...
将three.js场景保存成图片
使用html2canvas或者canvas.toDataURL,直接转会发现场景是空白的 解决方案:在转图片之前先渲染一下场景,就不会导致因为渲染问题的闪白了 1. 获取dom let canvas: any renderer.domElement;2. 转图片并下载 renderer.render(scene,camera…...
Java注解详解:从入门到实战应用篇
1. 引言 Java注解(Annotation)是JDK 5.0引入的一种元数据机制,用于为代码提供附加信息。它广泛应用于框架开发、代码生成、编译检查等领域。本文将从基础到实战,全面解析Java注解的核心概念和使用场景。 2. 注解基础概念 2.1 什…...
在哪一个终端下运行有影响吗?pip install pillow
在哪一个终端下运行有影响吗?pip install pillow -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn,需要切换到主目录吗? 1. 是否需要切换目录? 不需要切换目录 pip install 安装的包会存放…...
Java与C/C++跨平台互操作深度解析:Project Panama技术实战
简介 Project Panama是Java语言历史上最重要的互操作性增强项目之一,它通过Foreign Function & Memory API彻底改变了Java与本地代码交互的方式。相比传统的JNI方法,Panama提供了更安全、更高效、更易用的API,使得Java程序能够直接调用C/C++函数并操作外部内存,而无需…...
亲缘半相合供者
https://health.baidu.com/m/detail/ar_3602431741690417249 骨髓移植:亲缘半相合供者的经历分享 从去年八月开始,我妈妈被诊断为急性髓系白血病M4。经过一系列的准备和手术,昨天上午我终于完成了骨髓采集。现在,我的干细胞已经…...
《解锁数字藏品交易系统的底层密码:区块链架构抉择》
区块链,凭借其去中心化、不可篡改、可追溯等特性,成为数字藏品交易系统的核心支撑技术。不同的区块链底层架构,就像各具特色的建筑材料与蓝图,拥有独特的性能、特点以及应用场景。在搭建数字藏品交易系统时,必须深入剖…...
STM32F407VET6的HAL库使用CRC校验的思路
CRC校验在数据传输快,且量大的时候使用。 步骤实现: CubeMX配置 c // 在CubeMX中启用CRC模块 // AHB总线时钟自动启用 HAL库代码 c // 初始化(main函数中) CRC_HandleTypeDef hcrc; hcrc.Instance CRC; hcrc.Init.Default…...
TDuckX 2.6 正式发布|API 能力开放,核心表单逻辑重构,多项实用功能上线。
大家好,TDuckX 2.6 已正式发布。 本次更新以可集成性提升、数据处理能力增强和交互体验优化为核心,新增了包括 新增OpenAPI 模块、表单数据批量修改、字段导出分列 等多个面向开发者和实际业务落地场景的功能。 我们也重构了部分底层逻辑模块ÿ…...
智慧换热站全流程可视化管理
通过图扑 HT 实现换热站全方位数字孪生。对换热机组、管道阀门等设备精细建模,集成温度、流量、能耗等运行数据。在可视化界面中,设备状态实时呈现,异常即时预警。助力运维人员精准管理,优化调控策略,提升换热站运行效…...
框架的源码理解——V3中的ref和reactive
最近在研究各个框架的源码,从源码角度去理解 vue3 的 reactive 和 ref API,记录下研究的成果 reactive 首先,reactive() 的参数必须是一个对象,返回值是一个 Proxy 对象,具有响应性。如果参数不是对象类型࿰…...
一台入网的电脑有6要素, 机器名,mac,ip,俺码,网关,dns,分别有什么作用
一台入网的电脑需要配置的 六大网络要素(机器名、MAC地址、IP地址、子网掩码、网关、DNS)各自承担不同的关键作用,共同确保设备能正确通信和访问网络资源。以下是它们的详细功能解析: 1. 机器名(主机名) 作…...
LED点阵屏模块
目录 1.LED点阵屏介绍 2.显示原理 3.74HC595 4.C51的sfr、sbit 5.LED点阵屏显示图形代码 第一步: 第二步: 第三步: 第四步: 第五步: 第六步: 最终代码: 模块: main.c …...
服务器性能参数分析基础:磁盘-CPU-内存
在Linux系统中,"挂载"(Mount)是指将物理存储设备(如磁盘分区)或逻辑存储卷(如LVM、网络存储)关联到文件系统目录树的特定路径节点(即挂载点),使得该…...
MoonBit 新特性:Virtual Package 虚拟包机制
Moonbit 最近新增了一项特性:virtual package。通过将一个 package 声明为虚拟包,定义好一套接口(通过 .mbti 文件声明),用户可选择具体使用哪一份实现,如不指定则使用该虚拟包的默认实现。通过这项特性&am…...
[特殊字符][特殊字符]知识库PHP版 | ChatMoneyAI宝塔面板Docker多部署
官方文档💰📚知识库PHP版 | ChatMoneyAI docker-compose2.yml 修改文件名 ports:- "181:80" #【180】为Nginx挂载主机的端口 fastcgi_pass php1:9000; #名称修改php1 container_name: nginx1 #Nginx容器名修改 container_name: php1 #P…...
来一个复古的技术FTP
背景 10年前的老代码,需要升级springboot框架,在升级过程中,测试业务流程里,有FTP的下载业务,不管测试环境如何测试,都没有成功,最后只能自己搭建一个FTP服务器,写一个ftp-demo来测试…...
ShardingSphere:查询报错:Actual table `数据源名称.表名` is not in table rule configuration
目录 简介异常信息排查原因解决 简介 1、使用ShardingSphere框架,版本为5.2.1 <dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core</artifactId><version>5.2.1</version>…...
内部检测实验室数字化转型新路径 质检LIMS系统如何实现合规、效率、资质三重突破?
在高质量发展成为主旋律的今天,内部检测实验室作为企业质量管控的 “心脏”,正面临着合规标准升级、检测任务激增、设备管理复杂等多重挑战。传统管理模式下,数据追溯难、人员效率低、资质评审周期长等问题,成为制约实验室发展的核…...
PyTorch 的 F.scaled_dot_product_attention 返回Nan
“为什么 PyTorch 的 scaled_dot_product_attention 会输出 NaN?如何正确构造 Attention Mask” 引言:看似正常的 mask,为什么会引发 NaN? 在使用 F.scaled_dot_product_attention 构建跨模态或多源注意力时,我们常通…...
MySQL的触发器
本章了解一下即可,并不是很难,大家加油!!! 触发器实际上是多表关联的一个操作,无需调用,是一个自动的过程,当对数据库表中的数据执行DML操作时自动触发这个SQL片段的执行࿰…...
高可用消息队列实战:AWS SQS 在分布式系统中的核心解决方案
引言:消息队列的“不可替代性” 在微服务架构和分布式系统盛行的今天,消息队列(Message Queue) 已成为解决系统解耦、流量削峰、异步处理等难题的核心组件。然而,传统的自建消息队列(如RabbitMQ、Kafka&am…...
内存泄漏系列专题分析之十六:高通相机CamX内存泄漏内存占用分析--chi-cdk部分ION内存拆解方法
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:内存泄漏系列专题分析之十五:高通相机CamX架构chi-cdk部分ION内存管理机制CHI ImageBuffer原理 这一篇我们开始讲: 内存泄漏系列专题分析之十六:高通相机CamX内存泄漏&内存占用分析--chi-cdk部分…...
HANA数据库死锁
死锁是两个或多个事务相互交叉锁定的情况,因此任何事务都无法继续进行。 通常死锁是由应用程序设计缺陷引起的,但在主键约束的上下文中也可能存在更多的技术死锁(这种情况请参考 SAP note 2429521)。 当 HANA 数据库出现死锁时&am…...
Unity雷火UX工具插件中的本地化功能(Unity项目中文字图片多语言功能)
一、插件下载地址如下: 雷火UX工具插件下载 二、本地化功能,也就是多语言功能官方文档地址如下: 雷火UX工具本地化功能官方文档 三、UX Image组件需要注意的事项,也就是官方文档没有提到的地方。 1、UX Image组件所引用的Source Image资...