位运算
位运算(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…