详细介绍一下C++的按位运算

在C++中,按位运算(Bitwise Operations) 是直接对二进制位(bit)进行操作的低级运算,常用于处理硬件、优化性能、加密算法或底层资源管理。以下是按位运算符的详细说明、示例和典型应用场景:

1.按位运算符总览

C++提供以下按位运算符(操作对象为整数类型:int, char, short, long 等):

运算符名称功能示例
&按位与两个位都为1时结果为1,否则为0a & b
``按位或两个位至少有一个为1时结果为1`ab`
^按位异或两个位不同时结果为1,否则为0a ^ b
~按位取反所有位取反(0变1,1变0)~a
<<左移将二进制位左移若干位,右侧补0a << n
>>右移将二进制位右移若干位,左侧补符号位或0a >> n

2.运算符详解与示例

2.1 按位与(&)

  • 功能:仅当两个位均为1时结果为1。
  • 用途:提取特定位(掩码操作)、清零某些位。
  • 示例
int a = 0b1010; // 10进制:10
int b = 0b1100; // 10进制:12
int c = a & b;  // 0b1000 → 8

2.2 按位或(|)

  • 功能:只要有一个位为1,结果即为1。
  • 用途:设置特定位为1。
  • 示例
int a = 0b1010; // 10
int b = 0b1100; // 12
int c = a | b;  // 0b1110 → 14

2.3 按位异或(^)

  • 功能:两个位不同时结果为1。
  • 用途:交换变量值、翻转特定位。
  • 示例
int a = 0b1010; // 10
int b = 0b1100; // 12
int c = a ^ b;  // 0b0110 → 6

2.4 按位取反(~)

  • 功能:所有位取反(0变1,1变0)。
  • 注意:结果与整数类型及位数有关(例如,~0b0000 在4位中为 0b1111,即十进制 -1)。
  • 示例
int a = 0b1010; // 10
int b = ~a;     // 按位取反 → 0b...11110101(补码表示,实际值为-11)

2.5 左移(<<)

  • 功能:将二进制位左移 n 位,右侧补0。
  • 用途:快速乘以2的n次方(无溢出时)。
  • 示例
int a = 0b0001; // 1
int b = a << 3; // 0b1000 → 8(即 1 * 2^3)

2.6右移(>>)

  • 功能:将二进制位右移 n 位:
  • 有符号数:左侧补符号位(算术右移)。
  • 无符号数:左侧补0(逻辑右移)。
  • 用途:快速除以2的n次方(向下取整)。
  • 示例
int a = 0b1000;       // 8
int b = a >> 2;       // 0b0010 → 2(8 / 2^2)
int c = -8 >> 1;      // 算术右移 → -4
unsigned d = 0b1000;  
unsigned e = d >> 2;  // 逻辑右移 → 0b0010 → 2

3.复合赋值运算符

按位运算符可与赋值操作结合,简化代码:

a &= b; // 等价于 a = a & b
a |= b; // 等价于 a = a | b
a ^= b; // 等价于 a = a ^ b
a <<= n; // 等价于 a = a << n
a >>= n; // 等价于 a = a >> n

4.典型应用场景

4.1 位掩码(Bitmask)

  • 用途:管理标志位(如文件权限、状态标记)。
  • 示例
const int FLAG_A = 1 << 0; // 0b0001
const int FLAG_B = 1 << 1; // 0b0010
int flags = FLAG_A | FLAG_B; // 设置A和B标志
if (flags & FLAG_A) { /* 检查A标志 */ }
flags &= ~FLAG_B; // 清除B标志

4.2 交换变量值(不使用临时变量)

  • 原理:利用异或运算的性质 a ^ a = 0。
  • 示例
int a = 5, b = 3;
a ^= b; // a = 5 ^ 3
b ^= a; // b = 3 ^ (5 ^ 3) = 5
a ^= b; // a = (5 ^ 3) ^ 5 = 3

4.3 快速乘除与取模

  • 左移/右移代替乘除:
int a = 7;
int b = a << 3; // 7 * 8 = 56
int c = b >> 2; // 56 / 4 = 14
  • 取模(当除数为2的幂时):
int mod = a & ((1 << n) - 1); // 等价于 a % (2^n)

4.4 位操作技巧

  • 判断奇偶性
bool isEven = (num & 1) == 0; // 最末位为0则是偶数
  • 计算二进制中1的个数
int count = 0;
while (n) {n &= n - 1; // 每次消去最右边的1count++;
}

5.注意事项

  • 运算符优先级:按位运算符优先级低于算术运算符,需使用括号明确顺序。
    int c = (a & b) + 1; // 先执行 &,再加1
    
  • 符号位处理:右移有符号数时,高位补符号位(算术右移),可能导致负数结果。
  • 移位越界:若移位位数超过类型位数(如 int 左移32位),行为未定义(UB)。
  • 类型转换:操作数会被提升为 int 或更大的类型,可能引入意外符号位。

6.总结表

运算符用途示例
&掩码、清零位flags & MASK
``设置位`flagsFLAG_A`
^翻转位、交换值a ^= b
~位取反~0b1010 → 0b0101
<<左移(乘2的幂)a << 3
>>右移(除2的幂、算术/逻辑移位)a >> 2

按位运算在底层开发中极为重要,合理使用可显著提升代码效率和简洁性,但需谨慎处理边界条件和未定义行为。

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

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

相关文章

Flask与 FastAPI 对比:哪个更适合你的 Web 开发?

在开发 Web 应用时&#xff0c;Python 中有许多流行的 Web 框架可以选择&#xff0c;其中 Flask 和 FastAPI 是两款广受欢迎的框架。它们各有特色&#xff0c;适用于不同的应用场景。本文将从多个角度对比这两个框架&#xff0c;帮助你更好地选择适合的框架来构建你的 Web 应用…

Python爬虫第一战(爬取优美图库网页图片)

本文是我在学习过程中记录学习的点点滴滴,目的是为了学完之后巩固一下顺便也和大家分享一下,日后忘记了也可以方便快速的复习。 爬取网页图片 前言前言 今天学习的主要是关于如何利用Python爬取网页图片知识的理解和应用 # 1.获取网页信息,交给beautifulsoup # 2.获取页面里…

J1 ResNet-50算法实战与解析

&#x1f368; 本文為&#x1f517;365天深度學習訓練營 中的學習紀錄博客&#x1f356; 原作者&#xff1a;K同学啊 | 接輔導、項目定制 一、理论知识储备 1. 残差网络的由来 ResNet主要解决了CNN在深度加深时的退化问题&#xff08;梯度消失与梯度爆炸&#xff09;。 虽然B…

Python入门(3):语句

目录 1 基本语句 1.1 表达式语句 1.2 赋值语句 2 控制流语句 2.1 条件语句 2.2 循环语句 while循环&#xff1a; for循环&#xff1a; 2.3 流程控制语句 1. break语句&#xff1a;退出整个循环体 2. continue语句&#xff1a;只跳过本次循环&#xff0c;还会进…

浅浅尝试Numpy的函数s:

1.numpy.empty: numpy.empty方法用来创建一个指定形状&#xff08;shape&#xff09;&#xff0c;数据类型&#xff08;dtype&#xff09;且未被初始化的数组&#xff1a; numpy.empty(shape,dtype float,order C) 参数说明&#xff1a; shape:数组形状。 dtype:数据类型&am…

【C++】nlohmann::json 配置加载技术实践:从基础到高级应用

一、nlohmann::json 库概况与核心特性 nlohmann::json 是 C 社区最受欢迎的 JSON 库之一&#xff0c;其设计理念简洁即美&#xff0c;通过单头文件实现完整的 JSON 解析、序列化和操作功能。 1.1 基本特性 nlohmann::json是一个现代C编写的开源JSON库&#xff0c;采用MIT协议…

运算放大器(四)滤波电路(滤波器)

1.滤波电路概述 滤波电路简称滤波器&#xff0c;是一种能使某一部分频率的信号顺利通过&#xff0c;而使其它频率的信号被大幅衰减的电路。 2.滤波器的分类 &#xff08;1&#xff09;低通滤波器&#xff1a;低频信号能够通过&#xff0c;而高频信号不能通过的滤波器称为低通…

mac如何将jar包上传到maven中央仓库中

mac如何将jar包上传到maven中央仓库中 准备sonatype账号 sonatype官网&#xff1a;https://central.sonatype.com/ 建议使用GitHub账号注册&#xff0c;方便 之后选择查看用户信息 选择此选项获取用户token的username与password&#xff0c;建议提前复制一下谨防丢失 之后…

【通知】STM32MP157驱动开发课程全新升级!零基础入门嵌入式Linux驱动,掌握底层开发核心技能!

在嵌入式Linux系统开发中&#xff0c;驱动程序开发是一项关键技术&#xff0c;它作为硬件与软件之间的桥梁&#xff0c;实现了操作系统对硬件设备的控制。相较于嵌入式Linux应用开发&#xff0c;驱动开发由于涉及底层硬件且抽象程度较高&#xff0c;往往让初学者感到难度较大。…

高通将进军英国芯片 IP 业务 Alphawave

高通已确认有意收购高速连接模块设计公司 Alphawave Semi&#xff0c;此举可能会导致又一家英国大型科技公司被外国企业收购。 这家总部位于圣地亚哥的巨头已向伦敦证券交易所提交了一份声明&#xff0c;表示正在与 Alphawave 进行谈判&#xff0c;后者生产用于连接数据中心和…

多模态模型:专栏概要与内容目录

文章目录 多模态模型&#x1f4da; 核心内容模块Stable Diffusion基础教程Stable Diffusion原理深度解析部署与环境配置其他多模态模型实践 多模态模型 &#x1f525; 专栏简介 | 解锁AI绘画与多模态模型的技术奥秘 探索多模态AI技术&#xff0c;掌握Stable Diffusion等流行框…

Vue3 + Element Plus + AntV X6 实现拖拽树组件

Vue3 Element Plus AntV X6 实现拖拽树组件 介绍 在本篇文章中&#xff0c;我们将介绍如何使用 Vue 3 和 Element Plus 结合 antv/x6 实现树形结构的拖拽功能。用户可以将树节点拖拽到图形区域&#xff0c;自动创建相应的节点。我们将会通过简单的示例来一步步讲解实现过程…

cursor的.cursorrules详解

文章目录 1. 文件位置与作用2. 基本语法规则3. 常用规则类型与示例3.1 忽略文件/目录3.2 限制代码生成范围3.3 自定义补全建议3.4 安全规则 4. 高级用法4.1 条件规则4.2 正则表达式匹配4.3 继承规则 5. 示例文件6. 注意事项 Cursor 是一款基于 AI 的智能代码编辑器&#xff0c;…

黑马点评项目总结

redis的key设计规范 推荐规范: 业务前缀数据名称唯一id 比如表示文章点赞的用户集合: blog:like:${blogId} 刷新token有效期(拦截器实现) 使用双重拦截器解耦登录鉴权拦截和刷新有效期 RefreshTokenInterceptor: 拦截所有请求 只负责token续期 没有token则放行 Component p…

Java 大数据在智能安防入侵检测系统中的多源数据融合与分析技术(171)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

ARM架构+CODESYS:解锁嵌入式边缘计算的实时控制新范式

工业自动化、物联网和边缘计算的快速发展&#xff0c;ARM架构的边缘计算机凭借其低功耗、高性能和灵活扩展性&#xff0c;成为智能制造与物联网应用的核心载体。这类设备不仅支持Node-RED等可视化数据流工具&#xff0c;还能运行CODESYS工业控制平台&#xff0c;满足复杂场景下…

配置 UOS/deepin 系统远程桌面,实现多台电脑协同办公

由于开发工作的需要&#xff0c;我的办公桌上目前有多台电脑。一台是 i7 配置的电脑&#xff0c;运行 UOS V20 系统&#xff0c;作为主力办公电脑&#xff0c;负责处理企业微信、OA 等任务&#xff0c;并偶尔进行代码编译和验证软件在 UOS V20 系统下的兼容性&#xff1b;另一台…

1g内存电脑sqlite能支持多少并发

1. SQLite的并发机制 写操作&#xff1a;默认使用串行锁&#xff0c;同一时间仅允许一个写操作&#xff08;其他写/读需等待&#xff09;。读操作&#xff1a;支持多并发读取&#xff0c;但受内存、磁盘I/O和配置限制。 2. 关键限制因素 &#xff08;1&#xff09;内存资源 …

时间数据的可视化

目录 【实验目的】 【实验原理】 【实验环境】 【实验步骤】 【实验总结】 【实验目的】 掌握时间数据在大数据中的应用 掌握时间数据可视化图表表示 利用Python程序实现堆叠柱形图可视化 【实验原理】 时间是一个非常重要的维度与属性。时间序列数据存在于社会的各个…