位运算
位运算(Bitwise operation)

Introduction
位运算是指在程序设计中对位模式或二进制数的一元和二元操作。它是一种快速而简单的操作,由处理器直接支持,用于操作值进行比较和计算。
通常来说,在简单的低成本处理器上,按位运算有时比加法快,但比乘除快的多。虽然现代处理器执行加法和乘法的速度与按位运算一样快,但由于使用的资源减少,按位运算通常会使用更少的能耗。
Bitwise operators
先看看按位运算符(Bitwise operators)有哪些:
&(按位与,bitwise AND)|(按位或,bitwise OR)~(按位取反,bitwise NOT)^(按位异或,bitwise XOR)<<(按位左移,bitwise left shift)>>(按位左移,bitwise right shift)>>>(无符号按位右移,bitwise unsigned right shift)&=(按位与赋值,bitwise AND assignment)|=(按位或赋值,bitwise OR assignment)^=(按位异或赋值,bitwise XOR assignment)<<=(按位左移赋值,bitwise left shift and assignment)>>=(按位右移赋值,bitwise right shift and assignment)>>>=(无符号按位右移赋值,bitwise unsigned right shift and assignment)
实际只有前面 7 种,后面 7 种是复合操作,类似 +=,-=,例如 a &= b;,实际就是 a = a & b;。
bitwise AND
按位与是一个二元运算符,简单来说,就是对于每一个比特位,只有两个操作数相应的比特位都是 1 时,结果才为 1,否则为 0。有点像乘法,比如 1 * 1 还是 1,而 1 * 0 就是 0 了。
1 | 0101 (十进制 5) |
该操作可用于确定特定位是 1 还是 0。例如,给定位模式 0011(十进制,decimal 3),为了确定第二位是否为 1,我们使用按位与,仅在第二位中包含 1 的位模式:
1 | 0011 (十进制 3) |
因为结果 0010 不为 0,所以就可以知道原值(0011)中,第二位是 1,这个按位与的值(0010)通常称为位掩码(bit masking),即通过遮掩不感兴趣的部分(为 0 的部分)。来修改或获取对应位的值。
1 | 0110 (decimal 6) |
1 | 0110 (decimal 6) |
bitwise OR
对于每一个比特位,当两个操作数相应的比特位至少有一个 1 时,结果为 1,否则为 0。
bitwise NOT
反转操作数的比特位,即 0 变成 1,1 变成 0。
bitwise XOR
对于每一个比特位,当两个操作数相应的比特位有且只有一个 1 时,结果为 1,否则为 0。
bitwise left shift
将 a 的二进制形式向左移 b (< 32) 比特位,右边用 0 填充。
bitwise right shift
将 a 的二进制表示向右移 b (< 32) 位,丢弃被移出的位。
bitwise unsigned right shift
将 a 的二进制表示向右移 b (< 32) 位,丢弃被移出的位,并使用 0 在左侧填充。
Summary
Wait moment…