返回
Bitwise Operations: A Five-Minute Guide to Their Power and Elegance
前端
2024-02-17 07:04:38
五分钟掌握位运算操作,领略其巧妙之处
曾经在车站候车时无聊之余,我便回顾了先前学过的算法。其中有一道题:虽然不难,但进一步优化却颇具挑战,考验着面试者的数学和计算机二进制操作的基础。
说白了,就是看你是否真正理解计算机的二进制操作。
实际上,该算法的时间复杂度为 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
),我们消除了条件判断,从而提升了性能。
结语
位运算操作是计算机科学中的一把利器。理解并巧妙运用它们,可以极大地提升算法效率和简化代码。无论你是算法竞赛选手还是软件工程师,掌握位运算操作都是必不可少的技能。