位运算

位运算(Bitwise operation)

cover

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
2
3
    0101 (十进制 5)
AND 0011 (十进制 3)
= 0001 (十进制 1)

该操作可用于确定特定位是 1 还是 0。例如,给定位模式 0011(十进制,decimal 3),为了确定第二位是否为 1,我们使用按位与,仅在第二位中包含 1 的位模式:

1
2
3
    0011 (十进制 3)
AND 0010 (十进制 2)
= 0010 (十进制 2)

因为结果 0010 不为 0,所以就可以知道原值(0011)中,第二位是 1,这个按位与的值(0010)通常称为位掩码(bit masking),即通过遮掩不感兴趣的部分(为 0 的部分)。来修改或获取对应位的值。

1
2
3
    0110 (decimal 6)
AND 1011 (decimal 11)
= 0010 (decimal 2)
1
2
3
    0110 (decimal 6)
AND 0001 (decimal 1)
= 0000 (decimal 0)

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…

References