C++ 之字节取反及位运算反向编码

发布时间:2026/10/31 1:19:17
C++ 之字节取反及位运算反向编码 1. 对字节进行取反如果你想对一个字节的所有位进行取反即每个位从0变为1或从1变为0可以使用位运算符~。例如如果你有一个十六进制数0x6C在C中可以直接写作0x6C你可以这样取反#include iostream #include bitset // 用于打印二进制表示 int main() { unsigned char ten 0x02; unsigned char byte 0x6C; // 初始值为0x6C byte ~byte; // 对byte的所有位进行取反 std::cout ten: std::hex static_castint(ten) ( std::bitset8(ten) ) std::endl; std::cout Original: std::hex static_castint(byte) ( std::bitset8(byte) ) std::endl; // 打印原始值和二进制表示 std::cout Inverted: std::hex static_castint(~byte) ( std::bitset8(~byte) ) std::endl; // 再次对结果取反以恢复原始值并打印二进制表示 unsigned char temp ten byte; std::cout temp: std::hex static_castint(temp) ( std::bitset8(temp) ) std::endl; return 0; }输出结果ten: 2 (00000010) Original: 93 (10010011) Inverted: ffffff6c (01101100) temp: 2 (00000010)unsigned char temp ten ~0x6C; std::cout temp1: std::hex static_castint(temp) ( std::bitset8(temp) ) std::endl; 输出 ten: 2 (00000010) Original: 93 (10010011) Inverted: ffffff6c (01101100) temp1: 2 (00000000)当你再次对取反的结果使用~操作符时你将得到原始值。这是因为~操作符会将所有位取反。例如对于0x6C其取反结果为0xFFFFFF93如果byte是unsigned char类型的话实际上只有最低8位有意义其余高位将被忽略再次取反则为原始值。如果你想要看到完整的8位二进制表示可以使用上面代码中的方法通过std::bitset8来打印。注意使用~操作符时确保你了解其对数据类型的影响特别是对于无符号整型和有符号整型。在无符号整型中所有位都被取反。而在有符号整型中最高位符号位也被取反这可能会导致数值的符号改变从正变负或从负变正除非你明确知道你在做什么。对于有符号整型通常的做法是先将其转换为无符号类型再进行操作。在上面的示例中我使用了static_castint来确保在打印时能够正确显示数值因为直接打印无符号字符可能会导致一些混淆或错误的结果。对于演示目的我使用了这种方式。但在实际编程中通常不需要这样做除非你需要查看具体的数值。直接使用无符号字符类型进行计算和操作通常是更安全的。2. 位运算处理C 中的0xFFFFFFFF详解0xFFFFFFFF是一个十六进制字面量代表 8 个十六进制位每个十六进制位 4 个二进制位即 32 位的值所有位都是 1。它在 C 中有多种解释具体取决于存储类型和上下文。1. 基本含义#include iostream #include cstdint int main() { // 0xFFFFFFFF 的字面量类型 // 在大多数平台上它是一个 unsigned int 类型的值 std::cout 0xFFFFFFFF 作为 unsigned int: std::hex 0xFFFFFFFF std::dec std::endl; // ffffffff // 二进制表示1111 1111 1111 1111 1111 1111 1111 1111 // 也就是 32 位全为 1 return 0; }C 位取反~与异或^的区别这是一个很好的问题虽然两者都能翻转位但它们的语义和使用场景完全不同。1. 核心区别特性按位取反~按位异或^‌操作数‌一元运算符1 个操作数二元运算符2 个操作数‌作用‌将所有位 0→11→0相同位→0不同位→1‌真值表‌1→00→10^00, 0^11, 1^01, 1^10‌典型用途‌取反、构造掩码翻转特定位、加密、奇偶校验2. 真值表对比// 按位取反单操作数 // x: 0 1 0 1 // ~x: 1 0 1 0 // 按位异或双操作数 // a: 0 1 0 1 // b: 0 0 1 1 // ^: 0 1 1 0 (位不同则为1位相同则为0)综合运用反向编码0 已触发1 未触发reason ~(1 flag)—— 经典的位清除操作uint32_t reason{0xFFFFFFFF} reason ~(1 flag) —— 经典的位清除操作 等价于下述代码 uint32_t mask ~(1 p_flag); // 构造掩码仅 p_flag 位为 0其余为 1 reason mask; // 按位与将 p_flag 位清 0其余位保持不变位运算图解 假设 p_flag 3reason 0xFFFFFFFF初始哨兵值 1 3 0x08 (二进制: 00001000) 将整数1左移3位 ~(1 3) 0xF7 (二进制: 11110111) ← 掩码第3位为0 取反 reason (0xFFFFFFFF) 0xFFFFFFFF (二进制: 11111111 11111111 11111111 11111111) reason 0xF7 0xFFFFFFF7 (二进制: 11111111 11111111 11111111 11110111) ↑ 第3位被清0表示该原因已触发

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询