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

C++ 位运算(Bitwise Operations)全解

C 位运算Bitwise Operations全解主题要点示例位运算符^~为什么要学位运算速度快直接映射到 CPU 指令代码简洁掩码常常减少 loops低级硬件控制配合寄存器、IO、图像处理下面把所有常见的位运算讲得“通俗易懂”并配示例代码让你一下子能看到效果。1. 位运算符概览运算符含义说明按位与对应位都为 1 时结果为 1用来掩码取某些位按位或至少有一个 1 时结果为 1^按位异或两个对应位不相同则为 1用来翻转、计数奇偶位~按位取反每个位变成 1 - 该位取反后再与其他号做运算左移所有位往左移动低位补 0乘以 2 的幂右移所有位往右移动对 unsigned 高位补 0对 signed 高位按符号位补取反乘 2 的幂或除以 2 的幂注意位数是以二进制为单位。C 本身并不关心数是十进制还是十六进制二进制视角才是正确解释位运算的方式。2. 基础示例假设我们在 8 位设备中用 1 字节uint8_t存放 8 个状态位flags。位索引从右到左含义十六进制掩码0P10x011P20x022P30x043P40x084..7预留0xF0#include cstdint #include cstdio #include iostream using namespace std; int main() { uint8_t status 0x00; // 所有位 0 // 设置 P1、P3 位 status | 0x01; // P1 1 status | 0x04; // P3 1 printf(status after set: 0x%02X\n, status); // 0x05 // 查询 P3 是否为 1 bool p3_on status 0x04; // 非零则为 true cout P3 is (p3_on ? ON : OFF) endl; // 清除 P1 位 status ~0x01; // 把 P1 的掩码取反后与 status 做 把该位改为 0 printf(status after clear: 0x%02X\n, status); // 0x04 // 翻转 P3 位 status ^ 0x04; printf(status after toggle: 0x%02X\n, status); // 0x00 }输出示例status after set: 0x05 P3 is ON status after clear: 0x04 status after toggle: 0x00你会发现与() 用来提取掩码对应位或(|) 用来打开掩码对应位异或(^) 用来翻转掩码对应位取反(~) 与与() 结合可以关闭某位。3. 数位与掩码Mask掩码是位运算中最重要的概念。3.1 生成掩码auto getMask [](int pos){ // pos 从 0 开始 return 1u pos; // 1 向左位移 pos 位 };使用getMask(3)得到0x08(00001000)。3.2 提取某段连续位假设我们有 32 位整数其中 12–19 位置储存某段信息8 位。掩码可以这样创建uint32_t mask ((1u 8) - 1) 12; // 0x000FF000提取uint32_t value (num mask) 12; // 右移取值示例把地址中的区段拆开uint32_t address 0xABCD1234; uint8_t high (address 24) 0xFF; // 高 8 位 uint8_t mid (address 12) 0x0FFF; // 12 位 uint16_t low address 0xFFF; // 12 位 printf(high0x%02X mid0x%03X low0x%03X\n, high, mid, low);4. 位移运算Shift运算符含义示例说明x n左移 n 位相当于2ⁿint x 3 2;→x 12低位补 0注意溢出x n右移 n 位int y 12 2;→y 3对 unsigned 高位补 0对 signed 右移时会补符号位算术右移Tip对无符号uint8_t、uint32_t右移是安全的对有符号int右移要注意符号位补导致负数时不一定得到你想的结果。4.1 乘除 2 的幂x n等价于x * (1 n)x n等价于x / (1 n)对无符号整数int main() { int a 7; int b a 3; // 7 * 8 56 int c a 1; // 7 / 2 3 (整数除法) printf(%d 3 %d, %d 1 %d\n, a, b, a, c); }5. 常见技巧 典型用例目的C 代码说明检查偶数/奇数if (x 1) odd; else even;最右位LSB即1表示奇数快速求 2 的最大幂次int pow2 1 (sizeof(int)*8 - __builtin_clz(x));GCC/Clang 内建函数计数前导零翻转整数int rev ~x;相当于 XOR 0xFFFFFFFF快速乘 / 除 10tmp ((x * 0x5555) 1) (x * 0xAAAA); /* 近似 */不是精确值但整数运算很快缓冲区掩码u32 flags 0;// 0: no flagbr flags 0x01U;// 设置brflags ~0x02U;// 清除brif (flags 0x01U) …️ 小心安全~对无符号类型是 1 的补码结果通常是0xFFFFFFFF下的反码。位移超过类型宽度C 标准未定义例如1 32对 32 位类型请避免。有符号右移在不同编译器/CPU 之间可能差异除非知道高位补 0 还是补符号位算术 vs 逻辑移位。6. C 标准库帮助6.1std::bitset如果你需要动态或可读地操作固定长度位字段bitset是一把利器。#include bitset #include iostream int main() { std::bitset8 bs(0); // 8 位 bs.set(0); // 00000001 bs.set(2); // 00000101 std::cout bs \n; // 101 bs.flip(0); // 100 std::cout bs \n; }bitset也可以读取/修改单个位返回位对象甚至可以打印二进制字符串。6.2std::cntl/_builtin_popcount现代编译器提供内建函数来统计 1 位数也叫“population count”int popcnt32(unsigned x) { #if defined(__GNUC__) || defined(__clang__) return __builtin_popcount(x); #elif defined(_MSC_VER) return __popcnt(x); // MSVC 体验 #else // 手写 1 计数 int cnt 0; while (x) { cnt; x x - 1; } return cnt; #endif }x x - 1的技巧是“先把最低位 1 置零”。7. 高级主题可选如果你想进一步“加点料”可以了解以下内容略但想学的你可以自己去找教程方向说明位图压缩仅记录状态减少内存占用例如棋盘、地图SIMD使用诸如 SSE / AVX 的向量位运算一次处理 128/256 位位级哈希 / CRC用位运算实现校验码位指令直接给寄存器BSF,BSR,BLSF等了解二进制位的“最右 1 位”或“最左 1 位”位域struct { unsigned flag : 1; unsigned mode : 3; };用结构体的位域实现紧凑字段书面来说位运算让你把数据压缩到最低位做矩阵运算、视图剪裁、数码逻辑、甚至 AI 的稀疏矩阵都能用到。8. 总结位运算是对整数按位做 AND、OR、XOR、NOT、左/右移。掩码让你可以提取、设置、清除、翻转某一组位。位移与乘除 2 的幂直接相关特别高效。标准库std::bitset、__builtin_popcount让你写得更安全、更可读。注意签名的右移、溢出的未定义行为、搬运位宽限制。只要多练习你的假设比如把整数拆分成数独格、把float的符号位提取出来、把数据打包到 32 位就会发现C 位运算已经变成了你代码中的“快捷工具箱”。祝你玩得开心写出超快、高效又可读的代码

相关文章:

C++ 位运算(Bitwise Operations)全解

C 位运算&#xff08;Bitwise Operations&#xff09;全解主题要点示例位运算符& ^ ~ << >>为什么要学位运算&#xff1f;速度快&#xff08;直接映射到 CPU 指令&#xff09;代码简洁&#xff08;掩码常常减少 loops&#xff09;低级硬件控制&#xff08;配合…...

VBA-JSON实战宝典:解锁Excel数据处理的无限可能

VBA-JSON实战宝典&#xff1a;解锁Excel数据处理的无限可能 【免费下载链接】VBA-JSON JSON conversion and parsing for VBA 项目地址: https://gitcode.com/gh_mirrors/vb/VBA-JSON VBA-JSON是一款强大的JSON转换与解析工具&#xff0c;专为VBA&#xff08;Windows和M…...

如何高效使用Python工具实现百度网盘真实下载地址解析

如何高效使用Python工具实现百度网盘真实下载地址解析 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 百度网盘解析工具是一款基于Python开发的实用工具&#xff0c;专门用于提…...

Python逆向工程实战:如何绕过百度网盘限制获取真实下载地址

Python逆向工程实战&#xff1a;如何绕过百度网盘限制获取真实下载地址 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 在当今数据驱动的时代&#xff0c;百度网盘作为国内最大…...

Spring AI MCP服务如何选择使用 WebMVC还是WebFlux

在 Spring AI MCP 服务中选择使用 WebMVC 还是 WebFlux&#xff0c;主要取决于你项目的技术栈和性能需求。 简单来说&#xff0c;如果你的项目是传统的 Spring MVC 应用&#xff0c;就选 WebMVC&#xff1b;如果是响应式编程项目或需要处理高并发&#xff0c;就选 WebFlux。 下…...

离线完成上下位机时间同步(硬PTP和软NTP)

一、需求为了满足业务软件正常运行&#xff0c;需要配置时间同步一般的场景分为以下几种1、无时同设备需要对Linux系统之间进行软同步2、有时同设备需要对Linux系统之间进行硬同步3、无时同设备需要对Windows和Linux系统之间进行软同步4、有时同设备需要对Windows和Linux系统之…...

神经网络学习率调优指南与实战技巧

1. 学习率对神经网络性能的影响概述在训练神经网络时&#xff0c;学习率(Learning Rate)可能是最关键的单一超参数。它决定了每次参数更新的步长大小&#xff0c;直接影响着模型收敛的速度和质量。想象一下你在下山&#xff1a;学习率就像你每一步迈出的距离 - 步子太大可能越过…...

Phi-4-mini-flash-reasoning部署指南:Web工作台一键启用长文本推理

Phi-4-mini-flash-reasoning部署指南&#xff1a;Web工作台一键启用长文本推理 1. 模型介绍 Phi-4-mini-flash-reasoning 是一款专为复杂推理任务优化的轻量级文本模型&#xff0c;特别适合需要多步思考和分析的场景。不同于常规的文本生成模型&#xff0c;它更擅长&#xff…...

Casdoor开源身份认证平台:基于OAuth 2.0/OIDC的统一登录解决方案

1. 项目概述&#xff1a;一个开源的统一身份认证与单点登录平台如果你正在为一个新项目搭建用户系统&#xff0c;或者正在为手头一堆各自为政的应用&#xff08;比如内部的OA、CRM、知识库&#xff09;如何统一登录而头疼&#xff0c;那么你很可能需要了解Casdoor。简单来说&am…...

FastAPI部署机器学习模型:实战指南与性能优化

1. 机器学习模型部署实战&#xff1a;基于FastAPI的完整指南作为一名长期奋战在机器学习一线的工程师&#xff0c;我深知模型部署是许多同行最头疼的环节。今天我将分享一个经过生产验证的解决方案——使用FastAPI构建轻量级预测API。这个方案已经支撑了我们团队80%的中小型模型…...

平板电脑Linux内核显示配置实战:绕过HDMI探测,手动指定DP-1接口与分辨率

平板电脑Linux内核显示配置实战&#xff1a;绕过HDMI探测&#xff0c;手动指定DP-1接口与分辨率 在嵌入式设备开发中&#xff0c;显示配置往往是工程师面临的第一个挑战。不同于标准PC环境&#xff0c;平板电脑、工控设备等定制化硬件通常采用固定连接的显示屏&#xff0c;缺乏…...

别再折腾VCS破解了!用Iverilog+GTKWave在Ubuntu 20.04上快速搭建数字电路仿真环境

开源数字电路仿真指南&#xff1a;Iverilog与GTKWave高效工作流搭建 在数字电路设计与验证领域&#xff0c;商业EDA工具虽然功能强大&#xff0c;但其复杂的安装流程、高昂的授权费用和苛刻的运行环境要求常常让初学者望而却步。对于高校学生、硬件爱好者和初创团队而言&#x…...

告别虚拟机!在Win10上原生运行ROS Melodic/Foxy的保姆级配置指南(含VS2022适配)

在Windows 10上原生运行ROS Melodic/Foxy的终极指南&#xff08;VS2022适配版&#xff09; 对于机器人开发者而言&#xff0c;长期依赖虚拟机运行ROS不仅消耗系统资源&#xff0c;还会导致开发效率低下。本文将彻底解决这一痛点&#xff0c;手把手教你如何在Windows 10上原生配…...

ToolEmu:用LLM模拟工具测试AI代理安全性的框架解析与实践

1. 项目概述&#xff1a;用大语言模型“模拟”工具&#xff0c;提前发现AI代理的风险如果你正在开发或者使用基于大语言模型的智能代理&#xff0c;比如让GPT-4去调用搜索引擎、操作数据库、发送邮件&#xff0c;那你一定思考过这个问题&#xff1a;我怎么知道它不会捅出大篓子…...

WeDLM-7B-Base开源大模型教程:Diffusion LM与AR模型本质差异

WeDLM-7B-Base开源大模型教程&#xff1a;Diffusion LM与AR模型本质差异 1. 认识WeDLM-7B-Base模型 WeDLM-7B-Base是一款基于扩散机制&#xff08;Diffusion&#xff09;的70亿参数高性能语言模型。与传统的自回归&#xff08;AR&#xff09;模型不同&#xff0c;它采用创新的…...

从‘相似用户挖掘’实战出发:手把手教你用Faiss构建你的第一个向量检索系统

从‘相似用户挖掘’实战出发&#xff1a;手把手教你用Faiss构建你的第一个向量检索系统 在推荐系统和精准营销领域&#xff0c;寻找相似用户&#xff08;Look-alike&#xff09;是一项基础但关键的任务。想象一下&#xff0c;你手头有一批高价值用户&#xff0c;如何快速找到与…...

WeDLM-7B-Base一文详解:32K上下文扩散语言模型的推理加速与精度平衡

WeDLM-7B-Base一文详解&#xff1a;32K上下文扩散语言模型的推理加速与精度平衡 1. 模型概述 WeDLM-7B-Base是一款基于扩散机制&#xff08;Diffusion&#xff09;的高性能基座语言模型&#xff0c;拥有70亿参数规模。作为新一代语言模型的代表&#xff0c;它采用了创新的并行…...

LeaguePrank完整教程:安全修改英雄联盟段位显示的终极指南

LeaguePrank完整教程&#xff1a;安全修改英雄联盟段位显示的终极指南 【免费下载链接】LeaguePrank 项目地址: https://gitcode.com/gh_mirrors/le/LeaguePrank 你是否厌倦了英雄联盟客户端一成不变的段位显示&#xff1f;想要在朋友面前展示独特的个人资料页面&#…...

LM多风格生成探索:写实/时尚/角色/服饰四大方向提示词模板库

LM多风格生成探索&#xff1a;写实/时尚/角色/服饰四大方向提示词模板库 1. 平台介绍与特点 LM是基于Tongyi-MAI / Z-Image底座的文生图镜像&#xff0c;专为高质量图像生成而设计。这个开箱即用的解决方案已经完成了模型预加载和Web页面封装&#xff0c;用户无需编写任何代码…...

匝道合流控制序列优化及控制算法的三种对比场景

匝道合流控制序列优化控制算法&#xff1a; 总共包括三个对比函数&#xff1a; 匝道无控制场景&#xff1a;不对车辆将进行任何控制&#xff0c;由sumo自带算法运行 匝道序列采用先入先出控制采用最优控制&#xff08;哈密顿&#xff09;场景 匝道序列采用蒙特卡洛算法进行优化…...

YOLOv8部署后如何监控?资源占用监测实战教程

YOLOv8部署后如何监控&#xff1f;资源占用监测实战教程 1. 为什么YOLOv8上线后必须做资源监控&#xff1f; 你刚把YOLOv8工业级镜像部署好&#xff0c;点击HTTP按钮&#xff0c;上传一张街景图&#xff0c;5秒内就看到人、车、交通灯被框得清清楚楚&#xff0c;统计报告也跳…...

从理论到实践:基于扩展卡尔曼滤波(EKF)的永磁同步电机无位置传感器FOC控制

1. 扩展卡尔曼滤波&#xff08;EKF&#xff09;基础与电机控制的关系 我第一次接触扩展卡尔曼滤波是在研究生阶段&#xff0c;当时实验室的永磁同步电机总因为编码器故障导致停机。导师扔给我一篇论文说&#xff1a;"试试这个无位置传感器方案"。现在回想起来&#x…...

ARM SME2指令集:矩阵运算加速与AI性能优化

1. ARM SME2指令集架构概览在当今AI和机器学习工作负载爆炸式增长的时代&#xff0c;处理器架构设计正面临前所未有的挑战。作为应对&#xff0c;ARM公司在其v9架构中引入了Scalable Matrix Extension 2&#xff08;SME2&#xff09;指令集扩展&#xff0c;这是对第一代SME的重…...

神经网络常见层Numpy封装参考(4):优化器

目录前置层优化器SGD优化器Adam优化器测试演示完整代码下载 &#xff1a;神经网络常见层Numpy封装参考 - 常见层 前置层 - 神经网络常见层Numpy封装参考&#xff08;1&#xff09;&#xff1a;损失层 - 神经网络常见层Numpy封装参考&#xff08;2&#xff09;&#xff1a;线性…...

别再死磕PID了!用Python+MPC给机械臂做个‘未来视’控制器(附ROS2实战代码)

用PythonMPC为机械臂打造预测未来能力的智能控制器 机械臂控制领域正在经历一场静默革命——当大多数工程师还在用PID控制器解决90%的基础问题时&#xff0c;前沿实验室和科技公司早已将目光转向了更具前瞻性的控制策略。想象一下&#xff0c;如果你的控制器不仅能对当前误差做…...

如何快速解决Blender与3D打印机兼容问题:完整Blender3mfFormat使用指南

如何快速解决Blender与3D打印机兼容问题&#xff1a;完整Blender3mfFormat使用指南 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 您是否曾在Blender中精心设计了一个3D…...

QMCDecode终极指南:如何快速解密QQ音乐加密文件实现跨平台播放

QMCDecode终极指南&#xff1a;如何快速解密QQ音乐加密文件实现跨平台播放 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac&#xff0c;qmc0,qmc3转mp3, mflac,mflac0等转flac)&#xff0c;仅支持macOS&#xff0c;可自动识别到QQ音乐下载目录&#xff…...

ARGO:开源本地优先AI智能体平台部署与应用全指南

1. 项目概述&#xff1a;为什么我们需要一个“本地优先”的超级AI助手&#xff1f; 最近几年&#xff0c;AI助手的发展速度让人眼花缭乱。从最初的简单问答&#xff0c;到能联网搜索&#xff0c;再到能调用各种工具完成复杂任务&#xff0c;能力边界在不断拓宽。但一个核心问题…...

【高届数机械工程会议】第十二届机械工程、材料和自动化技术国际学术会议(MMEAT 2026)

第六届机器学习与智能系统工程国际学术会议&#xff08;MLISE 2026&#xff09; 2026 6th International Conference on Machine Learning and Intelligent Systems Engineering 北京航空航天大学主办 高届数机械工程会议推荐 往届检索稳定快速 会议官网&#xff1a; 第十二届…...

使用VS + VS Code + Cocos2d-x写游戏

Cocos2d-x是跨平台的2D游戏开发框架。 注意&#xff1a;必须用VS才能编译。 1 环境 1.1 Python 2.7 注意&#xff1a;必须下载Python2.7&#xff0c;3.x不行。 Python2.7下载地址&#xff0c;需要勾选Add python.exe to Path&#xff0c; 否则需要在系统环境变量Path添加Pyt…...