)
目录一、为什么会有原码、反码、补码三者关系总结二、四大位运算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有两种表示000000000-011111111一个数有两个编码显然不合理。最终人们在反码的基础上加1发明了「补码」完美解决了0的唯一性和减法运算的问题成为了计算机的最终选择。核心结论计算机中整数的存储和运算全部使用补码。后面所有位运算都是对补码的二进制位进行操作。记忆锚点正数三码合一负数反码加1。记住这一句话原反补的关系就串起来了。三者关系总结十进制数原码反码补码50000 01010000 01010000 0101-51000 01011111 10101111 101100000 00000000 00000000 0000-01000 00001111 11110000 0000溢出丢弃二、四大位运算2.1 按位与运算规则只有对应位都为1时结果位才为1只要有一个是0结果就是0。位A位BA B000010100111应用按位与的核心作用是清零、保留、判断像一个过滤网只留下我们想要的位。清零指定位置构造掩码要清零的位设为0保留的位设为1做按位与。例保留低4位高4位清零num num 0x0F;解释 0x0F 的二进制是 0000 1111。和原数做 之后高 4 位和 0 相与全部变 0低 4 位和 1 相与保持原样精准实现 “保留低 4 位、清零高 4 位”。判断某一位是否为1判断第n位从0开始if (num (1 n))解释11 是 0000 00106 的二进制是 0000 0110按位与结果是 0000 0010非 0说明第 1 位是 1。判断奇偶性num 1结果为1是奇数为0是偶数比取模%快得多解释1 的二进制只有最低位是 1和 num 做 之后只保留最低位其余位全部清零。2.2 按位或|运算规则对应位中只要有一个是1结果位就是1只有全为0时结果才是0。位A位BA | B000011101111应用按位或的核心作用是置1、合并像一个“叠加器”把指定的位“点亮”。将指定位置为1构造掩码要置1的位设为1其余为0做按位或。例把第2位置1num num | (1 2);解释2 的二进制是 0000 001012 是 0000 0100按位或之后是 0000 0110十进制 6。第 2 位成功变成 1其他位保持不变。合并标志位用每一位代表一种状态通过或运算叠加多个权限。例int perm READ | WRITE;同时赋予读和写权限解释READ | WRITE 结果是 0011两个权限位都被置 1。这是操作系统、驱动代码里管理状态的标准方式。2.3 按位异或^运算规则对应位相同则结果为0不同则结果为1。很多初学者容易把异或和或搞混记住异或是“不一样才为1”或是“有1就为1”。位A位BA ^ B000011101110异或的重要性质自身异或等于0a ^ a 0异或0等于自身a ^ 0 a交换律a ^ b b ^ a结合律(a ^ b) ^ c a ^ (b ^ c)应用异或是位运算里最巧妙的一个核心作用是翻转、交换、去重。翻转特定位构造掩码要翻转的位设为1其余为0做异或。例翻转低4位num num ^ 0x0F;不使用临时变量交换两个整数经典面试题aa^b;ba^b;// 等价于 b (a^b)^b a^(b^b) a^0 aaa^b;// 等价于 a (a^b)^a b找出数组中唯一出现奇数次的数所有数异或出现偶数次的会抵消为0剩下的就是答案2.4 按位取反~运算规则对二进制的每一位包括符号位全部取反0变11变0。易错点很多人以为只翻转数值位实际上符号位也会一起翻转所以正数取反会变成负数负数取反会变成正数。计算~6步骤先写补码 → 逐位取反 → 转成原码看十进制6的补码0000 0110按位取反1111 1001这是结果的补码是个负数转原码补码减1得反码 →1111 1000数值位取反 →1000 0111原码对应十进制-7所以~6 -7快速记忆对任意整数x都有~x -x - 1比如 ~6 -6-1 -7~(-5) 5-1 4应用配合按位与清零低位比如清零最低位num num ~1;~1就是除了最低位是0其他位都是1和num与之后最低位清零其他位不变快速求补数配合移位运算实现对齐、向上取整等操作。