位运算 按位操作、与或非异或、移位
直接对整数的二进制位逐位做与、或、非、异或等操作。
位运算是直接作用在整数二进制位上的运算,把两个数对齐后一位一位地处理,和加减乘除是完全不同的两套规则。常见的有四种逻辑操作:与(两位都为 1 才得 1)、或(有一位为 1 就得 1)、异或(两位不同才得 1)、取反(把每一位的 0 和 1 对调)。
还有一类是移位。左移一位相当于乘以 2,左移 n 位就是乘以 2 的 n 次方;右移一位相当于整除 2、向下取整丢掉余数。移位比乘除快,在底层代码里很常用。
位运算的实际用途集中在「精细控制某几位」:
- 掩码:用与运算配合一串特定的 1,取出想要的那几位
- 置位与清零:用或运算把某位置 1 开启开关,用与运算把某位清 0
- 异或妙用:一个数异或同一个数两次会变回原样,可用于简单加解密和不借助临时变量交换两个值
常见的坑是负数和位宽。计算机里负数用补码表示,对负数取反、移位得到的结果要放在固定位宽(8 位、32 位、64 位)里看才准确,超出范围的高位会被截断。做位运算前先确认处理的是几位整数。
关于位运算的常见问答
与、或、异或有什么区别?与是两位都为 1 才得 1,或是有一位为 1 就得 1,异或是两位不同才得 1。简单记:与要求都真,或只要一个真,异或要求不一样。
左移和乘法一样吗?对非负整数,左移 n 位就等于乘以 2 的 n 次方,速度更快。但左移只能乘 2 的幂,而且移出位宽的高位会丢失,乘法则不会。
异或能用来做什么?能找出两个数不同的位,也能不用临时变量交换两个值。因为一个数异或另一个数再异或同一个数会还原,所以常见于校验和简易加密。