讲师中心 微信公众号
AI工具推荐 视频效率加速

c++中bitset怎么用_c++位运算与位图【技巧】

落伟大大_5154

落伟大大_5154

发布时间:2026-02-14 18:23:03

|

730人浏览过

|

来源于php中文网

原创

std::bitset 初始化必须指定编译期常量大小,不支持运行时推导;下标 b[0] 表示最低位,位运算不隐式转换整数,移位超界位丢失,无迭代器需手动遍历。

c++中bitset怎么用_c++位运算与位图【技巧】

bitset 初始化必须指定大小,不能动态推导

编译器需要在编译期知道 std::bitset 占多少位,所以模板参数必须是常量表达式。写成 bitset<sizeof></sizeof> 没问题,但 bitset<n></n>(n 是运行时变量)直接报错,错误信息类似:non-type template argument is not a constant expression。

常见错误场景:想根据输入长度构造 bitset,比如读入一个字符串再建对应长度的 bitset——这行不通。得换思路,用 vector<bool></bool> 或手写动态位图。

  • 固定长度位操作(如 32 位标志位、64 位权限掩码)→ 用 bitset 或 bitset
  • 需要运行时长度 → 改用 vector<bool></bool>(注意它不是真正按 bit 存储的容器,性能差)或 boost::dynamic_bitset
  • 初始化支持字符串字面量:bitset b("10101010");,但字符串长度必须 ≤ 模板参数,否则截断或编译失败

位运算符重载行为和普通整数不同

bitset 支持 &、|、^、~,但结果仍是 bitset,不会隐式转成整数;而 和 <code>>> 是逻辑移位(高位/低位补 0),且移位数超长时直接丢弃(不报错也不循环)。

容易踩的坑:以为 b 等价于整数左移后取低 N 位,其实它只是把整个 bitset 往左挪 3 格,右边填 0,超出左边边界的位直接消失。比如 <code>bitset("1100") 结果是 <code>"0000",不是 "0011"。

立即学习“C++免费学习笔记(深入)”;

C++14
C++14

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

下载
  • 想模拟循环移位?得自己写:(b > (N - k)),注意括号和 N 是模板参数值
  • 要转成整数?用 b.to_ulong() 或 b.to_ullong(),但超过目标类型范围会抛 std::overflow_error
  • 避免混用:if (b & mask) 没问题,但 if (b & 0x0f) 会编译失败——右边不是 bitset 类型

访问单个 bit 用 operator[],但下标从右往左数

b[0] 是最低位(LSB),b[b.size()-1] 是最高位(MSB)。这和二进制字面量书写习惯一致(如 bitset("1010") 中 b[0] 是 0),但和数组“从左到右读”的直觉冲突,容易索引反了。

典型误用:想把某个位置设为 1,写成 b[i] = 1,结果改错了位;或者遍历输出时顺序颠倒,打印出镜像结果。

  • 安全遍历低位到高位:for (size_t i = 0; i → 输出 LSB 在前
  • 想按常规二进制顺序输出(MSB 在前):for (int i = b.size()-1; i >= 0; --i) ...,但注意 i 是无符号时 i >= 0 永真,得用有符号 int 或改写为 size_t i = b.size(); i-- > 0;
  • b.test(i) 和 b.set(i) 行为同 [],下标含义一致,别混淆

bitset 不是容器,不能用 STL 算法直接遍历

它没有 begin()/end() 迭代器,也没有 data() 返回原始内存。想对每个 bit 做操作(比如统计 1 的个数、找第一个 1),得靠自带方法或手动循环。

性能影响明显:对大 bitset(比如 bitset)调用 b.count() 是 O(N),但底层通常做了优化(如分块查表),比手写循环快得多;而 b.any() / b.none() 可能提前退出,实际很快。

  • 统计 1 的个数 → 优先用 b.count(),别手写循环
  • 找第一个置位位置 → b._Find_first()(GCC 扩展,非标准)或 for 循环 + test();标准做法是 b.to_string() 再找,但开销大,别这么干
  • 想用 std::transform 或 std::for_each?不行。要么封装成 vector(不推荐),要么老老实实写 for

事情说清了就结束。最麻烦的其实是下标方向和模板参数的编译期约束——这两点一旦写错,不是运行时报错,而是编译不过,而且错误信息绕口,得盯住模板实例化那一行。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

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

下载

相关标签:

c++

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

热门AI工具

更多
UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

超级麦吉

一款通过数字员工协作完成调研、数据分析与文档制作的AI办公平台。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6204

2023.10.24

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6204

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3164

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

1832

2025.10.17

counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3468

2023.11.20

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1818

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2884

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6204

2023.10.24

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

40

2026.10.28

热门下载

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

精品课程

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

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

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

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn