当前位置: 首页 > news >正文

原码、反码、补码与位运算(与/或/异或/取反)

目录

  • 一、为什么会有原码、反码、补码
    • 三者关系总结
  • 二、四大位运算
    • 2.1 按位与(&)
      • 应用
    • 2.2 按位或(|)
      • 应用
    • 2.3 按位异或(^)
      • 异或的重要性质
      • 应用
    • 2.4 按位取反(~)
      • 计算~6
      • 应用

一、为什么会有原码、反码、补码

计算机只能识别0和1,也就是二进制。那我们怎么表示负数呢?
人们最先想到的办法:把二进制的最高位拿出来当符号位,0表示正数,1表示负数,剩下的位表示数值。这就是「原码」。
但原码有个致命问题:减法算不对
比如计算1 + (-1),用8位原码算:

0000 0001 (+1的原码) + 1000 0001 (-1的原码) ------------ 1000 0010 (结果是-2,明显不对)

为了解决原码的减法问题,人们发明了「反码」:负数的数值位按位取反,符号位不变。这样减法就可以转换成加法来算。
但反码还是有问题:0有两种表示(+0:00000000,-0:11111111),一个数有两个编码显然不合理。
最终,人们在反码的基础上加1,发明了「补码」,完美解决了0的唯一性和减法运算的问题,成为了计算机的最终选择。

核心结论:计算机中整数的存储和运算,全部使用补码。后面所有位运算,都是对补码的二进制位进行操作。
记忆锚点:正数三码合一,负数反码加1。记住这一句话,原反补的关系就串起来了。

三者关系总结

十进制数原码反码补码
+50000 01010000 01010000 0101
-51000 01011111 10101111 1011
+00000 00000000 00000000 0000
-01000 00001111 11110000 0000(溢出丢弃)

二、四大位运算

2.1 按位与(&)

运算规则:只有对应位都为1时,结果位才为1;只要有一个是0,结果就是0。

位A位BA & B
000
010
100
111

应用

按位与的核心作用是清零、保留、判断,像一个过滤网,只留下我们想要的位。

  1. 清零指定位置:构造掩码,要清零的位设为0,保留的位设为1,做按位与。
    例:保留低4位,高4位清零:num = num & 0x0F;

解释: 0x0F 的二进制是 0000 1111。和原数做 & 之后,高 4 位和 0 相与全部变 0,低 4 位和 1 相与保持原样,精准实现 “保留低 4 位、清零高 4 位”。

  1. 判断某一位是否为1:判断第n位(从0开始):if (num & (1 << n))

解释:1<<1 是 0000 0010,6 的二进制是 0000 0110,按位与结果是 0000 0010(非 0),说明第 1 位是 1。

  1. 判断奇偶性num & 1结果为1是奇数,为0是偶数(比取模%快得多)

解释:1 的二进制只有最低位是 1,和 num 做 & 之后,只保留最低位,其余位全部清零。

2.2 按位或(|)

运算规则:对应位中只要有一个是1,结果位就是1;只有全为0时,结果才是0。

位A位BA | B
000
011
101
111

应用

按位或的核心作用是置1、合并,像一个“叠加器”,把指定的位“点亮”。

  1. 将指定位置为1:构造掩码,要置1的位设为1,其余为0,做按位或。
    例:把第2位置1:num = num | (1 << 2);

解释:2 的二进制是 0000 0010,1<<2 是 0000 0100,按位或之后是 0000 0110(十进制 6)。第 2 位成功变成 1,其他位保持不变。

  1. 合并标志位:用每一位代表一种状态,通过或运算叠加多个权限。
    例:int perm = READ | WRITE;同时赋予读和写权限

解释:READ | WRITE 结果是 0011,两个权限位都被置 1。这是操作系统、驱动代码里管理状态的标准方式。

2.3 按位异或(^)

运算规则:对应位相同则结果为0,不同则结果为1。
很多初学者容易把异或和或搞混,记住:异或是“不一样才为1”,或是“有1就为1”。

位A位BA ^ B
000
011
101
110

异或的重要性质

  1. 自身异或等于0a ^ a = 0
  2. 异或0等于自身a ^ 0 = a
  3. 交换律a ^ b = b ^ a
  4. 结合律(a ^ b) ^ c = a ^ (b ^ c)

应用

异或是位运算里最巧妙的一个,核心作用是翻转、交换、去重

  1. 翻转特定位:构造掩码,要翻转的位设为1,其余为0,做异或。
    例:翻转低4位:num = num ^ 0x0F;
  2. 不使用临时变量交换两个整数:经典面试题
    a=a^b;b=a^b;// 等价于 b = (a^b)^b = a^(b^b) = a^0 = aa=a^b;// 等价于 a = (a^b)^a = b
  3. 找出数组中唯一出现奇数次的数:所有数异或,出现偶数次的会抵消为0,剩下的就是答案

2.4 按位取反(~)

运算规则:对二进制的每一位(包括符号位)全部取反,0变1,1变0。

易错点:很多人以为只翻转数值位,实际上符号位也会一起翻转,所以正数取反会变成负数,负数取反会变成正数。

计算~6

步骤:先写补码 → 逐位取反 → 转成原码看十进制

  1. 6的补码:0000 0110
  2. 按位取反:1111 1001(这是结果的补码,是个负数)
  3. 转原码:补码减1得反码 →1111 1000,数值位取反 →1000 0111
  4. 原码对应十进制:-7

所以~6 = -7

快速记忆:对任意整数x,都有~x = -x - 1
比如 ~6 = -6-1 = -7,~(-5) = 5-1 = 4

应用

  1. 配合按位与清零低位:比如清零最低位:num = num & ~1;
    ~1就是除了最低位是0,其他位都是1,和num与之后最低位清零,其他位不变)
  2. 快速求补数:配合移位运算实现对齐、向上取整等操作。
http://www.cnnetsun.cn/news/4258346.html

相关文章:

  • Python数学建模实战:数据拟合、优化与蒙特卡洛模拟核心技巧
  • Agentic RAG工作流:轻量级智能体问答系统实战
  • 线性规划建模与求解:从数学建模到MATLAB/Python实战
  • C++模板类与STL实战:构建泛型数据管理器的工程化指南
  • 气动系统电磁阀选型
  • Signal拟推免手机号注册:一次性付费背后的账号体系设计与反滥用权衡
  • 蓝桥杯国赛“扩散”题解:从BFS模拟到曼哈顿距离的算法优化
  • VOC格式路面缺陷数据集的工程化解析与实战指南
  • AI助理技术拆解:用RAG打造企业知识库实战
  • 字符串周期模式匹配:贪心算法与分组统计实战解析
  • FPGA驱动VGA显示:从时序原理到工程实践全解析
  • ASP.NET返利购物商城系统:架构设计与佣金计算引擎实现
  • Parallels Desktop 27图形与AI性能提升全解析
  • Zero-Mem:零Token消耗的LLM Agent记忆管理新方案
  • 面向非技术团队的 AI 落地实践:从试点、权限到反馈闭环的全流程指南
  • DeepSeek API涨价应对指南:成本估算与工程优化策略
  • 世界模型实战:从概念到千人联机状态同步原型
  • Lustre云上实践:ZFS OST基于对象存储的架构与部署
  • BERT文本情感分析实战:从原理到工业级部署
  • AI智能体产品化:从核心概念到Dify实战的工程指南
  • AI应用出海:从功能Demo到稳定留存的产品化之路
  • 电工杯数学建模B题解析:从工业优化到MILP模型实战
  • C++模板编程核心:函数模板与类模板的区别及实战应用
  • 提示词驱动软件:用自然语言改变程序行为的设计与实现
  • Matplotlib直方图实战:从数据分布到建模应用
  • 本地模型建筑足迹提取横向对比:YOLOv8与SAM实战指南
  • 希望存在的软件:如何把工作流缺口变成可执行需求
  • Lefts:用声明式DSL简化创意机器学习模型构建与实验
  • 电子信息与通信工程保研考研复试:联系导师策略与邮件撰写全指南
  • Run With Zombies:用浏览器GPS定位实现真实世界的僵尸追逐游戏