C++使用宏打印变量二进制位时输出逆序该如何修复?
问题原因
你的代码输出顺序错误存在两个核心问题:
- 单字节内的位遍历顺序颠倒:当前从字节的最低位(第0位)开始打印,正确顺序应该优先打印字节的最高位(
CHAR_BIT - 1位) - 多字节类型的字节遍历顺序颠倒:你从变量的低地址字节开始遍历,小端架构下低地址存的是变量的低字节,会导致多字节数值的整体二进制顺序错误,应该从最高地址字节往回遍历
修改后的完整实现
#include <iostream> #include <memory> #include <climits> template < typename T > void printlnbits (T v) { const int bit_count = sizeof (T) * CHAR_BIT; auto const bytes_start = reinterpret_cast<unsigned char const *>(std::addressof(v)); // 从最高地址的字节开始遍历 for (int byte_idx = sizeof(T) - 1; byte_idx >= 0; --byte_idx) { unsigned char cur_byte = bytes_start[byte_idx]; // 每个字节从最高位往最低位打印 for (int bit_idx = CHAR_BIT - 1; bit_idx >= 0; --bit_idx) { std::cout << ((cur_byte >> bit_idx) & 1 ? 1 : 0); } std::cout << " "; } std::cout << " " << bit_count << " bits" << std::endl; } int main () { const char a = 'a'; const char b = 2; const int c = 0x1234; // 多字节测试用例 printlnbits (a); printlnbits (b); printlnbits (c); return 0; }
如果要保留你原本的宏定义,只需把打印位的逻辑替换为EXTRACTBIT(bit_idx, &cur_byte)即可。
运行验证结果
01100001 8 bits 00000010 8 bits 00000000 00000000 00010010 00110100 32 bits
简化建议
如果不需要手动实现遍历逻辑,直接使用C++标准库的std::bitset可以一行实现相同效果,代码更简洁易维护:
#include <iostream> #include <bitset> #include <climits> template <typename T> void printlnbits(T v) { constexpr int bit_count = sizeof(T) * CHAR_BIT; std::cout << std::bitset<bit_count>(v) << " " << bit_count << " bits\n"; }
内容的提问来源于stack exchange,提问作者Darke
相关产品推荐
相关产品推荐

