返回

Bitwise Operations: A Five-Minute Guide to Their Power and Elegance

前端

五分钟掌握位运算操作,领略其巧妙之处

曾经在车站候车时无聊之余,我便回顾了先前学过的算法。其中有一道题:虽然不难,但进一步优化却颇具挑战,考验着面试者的数学和计算机二进制操作的基础。

说白了,就是看你是否真正理解计算机的二进制操作。

实际上,该算法的时间复杂度为 O(n),但本质上是一个涉及位运算的数学问题。

位运算操作的基本概念

位运算操作是在二进制数的位级别上执行的。计算机以二进制的形式存储数据,即由 0 和 1 组成。位运算允许我们直接操作这些位,执行逻辑和算术运算。

常用的位运算符

常用的位运算符包括:

  • &(与):逐位比较两个二进制数,如果对应位都为 1,则结果为 1,否则为 0。
  • |(或):逐位比较两个二进制数,如果对应位有一个为 1,则结果为 1,否则为 0。
  • ^(异或):逐位比较两个二进制数,如果对应位不同,则结果为 1,否则为 0。
  • ~(非):将二进制数的每个位取反,即 0 变 1,1 变 0。
  • <<(左移):将二进制数的位向左移动指定位数,左侧补 0。
  • >>(右移):将二进制数的位向右移动指定位数,左侧补符号位。

位运算操作的巧妙运用

位运算操作的巧妙运用可以极大地提高算法效率和简化代码。例如,我们可以使用位运算来:

  • 快速判断一个数是否是偶数(通过与 1 做与运算)。
  • 设置或清除一个二进制数的特定位。
  • 快速查找两个整数的最小公倍数和最大公约数。

示例:优化一个算法

回到前面提到的算法优化问题。原始算法使用循环来计算一个整数中 1 的个数。通过使用位运算,我们可以大幅提升效率:

def count_ones(n):
  """计算整数 n 中 1 的个数。"""

  count = 0
  while n > 0:
    if n & 1 == 1:
      count += 1
    n >>= 1
  return count

优化后的代码:

def count_ones(n):
  """计算整数 n 中 1 的个数。"""

  count = 0
  while n > 0:
    count += n & 1
    n >>= 1
  return count

通过使用按位与运算 (n & 1),我们消除了条件判断,从而提升了性能。

结语

位运算操作是计算机科学中的一把利器。理解并巧妙运用它们,可以极大地提升算法效率和简化代码。无论你是算法竞赛选手还是软件工程师,掌握位运算操作都是必不可少的技能。