C++按位与运算符怎么使用

老瑶姑娘_6615

老瑶姑娘_6615

2026-10-15

333人浏览

原创

按位与 & 是对两个整数的每一位执行“同为1则得1”的二进制运算,非逻辑判断;要求操作数为整型,参与运算前会整型提升,优先级低于 ==,需括号确保逻辑正确,常用于提取或清零特定位。

c++按位与运算符怎么使用

按位与 & 是什么,不是逻辑与 &&

很多人一看到 & 就想到“并且”,结果在 if (a & b) 里踩坑:它不判断真假关系,而是对两个整数的每一位做二进制“同为 1 则得 1”的运算。比如 5 & 3 实际算的是 0b101 & 0b011 → 0b001 = 1,和逻辑短路完全无关。

常见错误现象:if (flags & ENABLE_LOG) 写成 if (flags && ENABLE_LOG) —— 后者只要两个非零就恒真,彻底失去位掩码意义。

  • & 要求操作数是整型(int、unsigned char、std::uint32_t 等),不能用于浮点或指针
  • 运算前会做整型提升(如 char 自动转 int),注意符号扩展问题:负数 char c = -1; 提升后可能变成全 1 的 int,影响结果
  • 优先级比 == 和 != 低,if (flags & MASK == 0) 实际等价于 if (flags & (MASK == 0)),必须加括号:if ((flags & MASK) == 0)

提取某一位或一组位:用 & 配合掩码

这是最常用场景——比如从寄存器值中读取第 3 位(bit 2,从 0 开始计),或检查是否启用了某个标志位。

典型用法:(value & (1 判断第 <code>n 位是否为 1;value & 0xFF 取低 8 位。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • 推荐用无符号类型定义掩码,避免符号问题:constexpr std::uint8_t BIT_3 = 1U
  • 不要手写二进制字面量(如 0b1000)依赖编译器支持,C++14 才正式支持,老项目慎用
  • 如果要提取连续多位(如 bit 4~6),掩码写成 0x70(即 0b1110000),再右移:(value & 0x70) >> 4

清零某些位:用 & 配合取反掩码

想把变量中某些位强制设为 0,其他位保持不变,就得先构造“除了目标位全为 1”的掩码,再与原值做 &。

例如清除 status 的第 0 和第 2 位:status = status & ~(BIT_0 | BIT_2);。这里 ~ 是按位取反,| 是按位置或,组合起来才是“只清指定位置”。

  • 别漏掉括号:~BIT_0 | BIT_2 是错的,~ 优先级高于 |,实际算的是 (~BIT_0) | BIT_2
  • 如果掩码是编译期常量,~ 会在编译时完成,无运行时开销;但若掩码来自变量,~ 是实打实的指令
  • 清零操作是原子的(单条指令),适合多线程中配合 std::atomic 使用,但需确保整数大小匹配平台原子性要求(如 x86 上 int 通常可原子读写)

和 std::bitset 或 std::vector<bool></bool> 混用要注意

std::bitset 重载了 &,行为符合直觉(逐位与),但 std::vector<bool></bool> 是特化容器,其 operator&= 并不存在,也不能直接拿 std::vector<bool></bool> 和整数做 &。

错误示例:std::vector<bool> v = {1,0,1}; auto r = v & 5;</bool> —— 编译失败,因为没定义该运算符。

  • 需要位运算逻辑时,优先选 std::bitset<n></n>(N 必须是编译期常量)或原始整数类型
  • std::bitset 的 & 返回新 bitset,不修改原对象;&= 才是就地修改
  • 跨平台注意:std::bitset::to_ulong() 在位数超 unsigned long 容量时抛异常,大位宽建议用 to_ullong() 或手动分段处理
实际用的时候,最易忽略的是运算符优先级和整型提升带来的隐式转换。尤其是把 char 或 short 直接扔进位运算,又没加 U 后缀,结果可能因符号扩展完全偏离预期。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++ c++运算符

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.14

2248

9

c++和python学习顺序推荐
c++和python学习顺序推荐

一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

1019

6

python和c++学习性价比分析
python和c++学习性价比分析

Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

427

5

c语言和c++一样吗
c语言和c++一样吗

c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

327

5

c语言和c++先学哪个好
c语言和c++先学哪个好

初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

406

5

c语言和c++的区别和联系
c语言和c++的区别和联系

c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

580

5

c++软件中文更改教程
c++软件中文更改教程

对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.21

1409

9

python和java和c++学习性价比分析
python和java和c++学习性价比分析

Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

2024.03.22

1217

7

c++和c语言学习顺序推荐
c++和c语言学习顺序推荐

对于初学者,建议先学习C语言,掌握编程基础后再转入C++,便于理解面向对象编程概念。有编程经验者可直接学习C++,快速接触高级编程技术。想了解更多c++和c语言的相关内容,可以阅读本专题下面的文章。

2024.03.25

1325

9

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习