c++14起支持二进制字面量,必须以0b或0b开头,后跟0/1;错误写法如0b102、b1010或旧标准下使用均导致编译失败;正确示例为int a = 0b1010;,且支持单引号分隔提升可读性。

二进制字面量只能用 0b 或 0B 前缀(C++14 起)
在 C++ 中,原生二进制整数字面量从 C++14 开始才被支持,必须以 0b 或 0B 开头,后面跟 0 和 1。不支持 0x 那种十六进制的变体,也不接受 bin()、binary() 等函数形式。
常见错误包括:
- 写成
0b102(含非法字符2)→ 编译失败 - 写成
b1010(缺前导0)→ 被当作文本或变量名,报错use of undeclared identifier 'b1010' - 在 C++11 或更早标准下使用
0b1111→ 编译器报错invalid suffix on literal或类似提示
正确示例:
int a = 0b1010; // 十进制 10 unsigned char flag = 0b1100'0011; // C++14 支持单引号分隔(可读性增强)
std::bitset 是运行时处理二进制位的最佳选择
如果需要动态构造、翻转、移位或按位操作一串二进制位(比如解析协议字段、实现标志位集合),std::bitset 比手动算幂或位运算更安全、清晰。
注意点:
-
std::bitset<n></n>大小N必须是编译期常量,不能是变量 - 初始化支持字符串(如
std::bitset("10101010")),但字符串内容必须全为'0'或'1',且长度 ≤N;超长会被截断,过短则高位补0 - 不支持直接用
0b字面量初始化(如std::bitset(0b1100)是合法的,但本质是传入整数,不是“二进制表示”)
典型用法:
std::bitset flags(0b1001'0110); // 构造时用字面量赋值 flags.set(2); // 第 2 位(从 0 开始)设为 1 flags.test(3); // 返回 bool,检查第 3 位是否为 1
输出二进制字符串得靠 std::bitset::to_string() 或手动循环
C++ 标准库没有内置的 std::cout 流操纵符,所以不能像 <code>std::hex 那样直接输出二进制格式。
两种主流做法:
- 用
std::bitset中转:适合已知位宽的整数(如uint8_t),调用.to_string()得到std::string,再输出 - 手动位移 + 取模:适合任意大小整数(如
long long),但要注意高位零抑制或补零逻辑
示例(固定宽度输出):
uint8_t x = 0b110; std::cout (x).to_string(); // 输出 "00000110"
如果只想要无前导零的结果,就得自己循环判断最高位位置,std::bitset 不提供“trim”功能。
跨平台和兼容性陷阱:别依赖编译器扩展
某些旧编译器(如早期 GCC)曾支持 GNU 扩展 0b,但行为不统一;MSVC 在 VS2015 前完全不支持。现在虽已标准化,但仍需确认项目标准设置:
- CMake 中确保
set(CMAKE_CXX_STANDARD 14)或更高 - 命令行编译加
-std=c++14(GCC/Clang)或/std:c++14(MSVC) - 不要混用
0b和八进制(0开头)——例如0b011是二进制 3,而0011是八进制 9,极易误读
真正容易被忽略的是:二进制字面量本身不携带类型信息,其类型由值大小和上下文决定(如 0b1111'1111'1111'1111 在 16 位系统上可能溢出)。务必配合显式类型(uint32_t、constexpr auto 等)使用。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











