文章目录
一、引言
各位编程爱好者们!在代码的广袤天地里不断探索的你们,是否时常惊叹于那些简洁到极致、运行如闪电般迅速的代码?它们仿佛被施了神奇魔法,轻松搞定复杂难题。其实呀,这魔法背后的秘密武器之一,就是位运算!别小瞧这由0和1交织而成的神秘世界,它蕴含着无穷力量,能让你的程序效率实现质的飞跃。想象一下,别人还在苦思冥想、用冗长代码艰难“攀爬”时,你凭借位运算,只需寥寥数行,就能让程序“嗖”地一下冲破阻碍,率先抵达终点,这般体验是不是超酷?现在,就请紧跟我的脚步,一同踏入位运算的奇妙领域,借由一个个趣味盎然又超级实用的题目,搭配Python代码实战,开启这场解锁神奇编程魔法的精彩旅程吧!
二、位运算基础概念速览
在一头扎进题目之前,咱们先来热热身,快速回顾下位运算的基本“招式”,也就是按位与(&)、按位或(|)、按位异或(^)、按位取反(~)、左移(<<)和右移(>>)。看看下面这些简单的代码示例,你就能初步领略它们的威力:
a = 5 # 二进制为 101
b = 3 # 二进制为 011
- 与(&)
print(a & b) # 按位与,结果为 1(二进制 001)
解释:按位与操作是对两个数的二进制位逐位进行与运算,只有当对应位都为1时,结果位才为1,就像这里5的二进制101和3的二进制011,只有最低位都是1,所以结果为001即1。精妙之处在于能快速筛选出某些特征位相同的情况,常用于掩码操作,比如权限判断等场景。
- 或(|)
print(a | b) # 按位或,结果为 7(二进制 111)
解释:按位或运算则是只要两个数对应二进制位有一个为1,结果位就为1。如101和011,三位分别进行或操作,就得到111也就是7。在需要合并某些特征位时非常实用,比如设置多个标志位。
- 异或(^)
print(a ^ b) # 按位异或,结果为 6(二进制 110)
解释:按位异或颇为有趣,当两个对应位不同时,结果为1,相同则为0。像101和011异或,就得到110即6。它常用于加密算法中的简单混淆、数据备份对比等场景,能快速找出不同之处。
- 取反(~)
print(~a) # 按位取反,结果为 -6 (补码表示)
解释:按位取反是将二进制数的每一位都翻转,0变1,1变0。不过由于计算机存储整数采用补码形式,正数5取反后得到的是-6的补码表示。在一些底层操作,如硬件驱动编程中对寄存器某些位取反操作时会用到。
- 左移(<<)
print(a << 1) # 左移 1 位,结果为 10(二进制 1010)
解释:左移操作就是把二进制数的所有位向左移动指定的位数,右边空出的位用0填充。5即101左移1位变成1010也就是10,相当于乘以2的移动位数次幂,这是快速进行乘法运算(乘数为2的幂)的技巧。
- 右移(>>)
print(a >> 1) # 右移 1 位,结果为 2 (二进制 010)
#解释:右移相反,把二进制数向右移,左边空出的位根据符号位情况填充,正数填0。5即101右移1位成010即2,类似除以2的移动位数次幂,用于快速除法(除数为2的幂),能提升运算效率。
注:python没有无符号右移(>>>),究其原因,感兴趣的读者可以看我之前发的另一篇文章:

最低0.47元/天 解锁文章
40万+

被折叠的 条评论
为什么被折叠?



