如何仅使用位运算将二进制数中的独立1替换为0?
解决方案:纯位运算实现独立1清零
核心思路是先定位所有“独立1”的位置,再将这些位从原数中抹去,全程无需循环:
标记独立1:一个位是独立1的判定条件是——自身为1,且左右相邻位(若存在)均为0。用位运算可快速实现:
num << 1:原数左移一位,结果中为1的位对应原数该位左侧是1num >> 1:原数右移一位,结果中为1的位对应原数该位右侧是1- 用
~(num << 1) & ~(num >> 1)得到“左右均无1”的位掩码,再和原数做与运算,就能提取出所有独立1的位置:isolated_ones = num & ~(num << 1) & ~(num >> 1)
清零独立1:将原数与独立1掩码的反码做与运算,即可把这些独立1置为0:
result = num & ~isolated_ones
代码示例
# 测试示例1:11010 → 11000 num = 0b11010 isolated_ones = num & ~(num << 1) & ~(num >> 1) result = num & ~isolated_ones print(bin(result)) # 输出 0b11000 # 测试示例2:10101 → 00000 num = 0b10101 isolated_ones = num & ~(num << 1) & ~(num >> 1) result = num & ~isolated_ones print(bin(result)) # 输出 0b0 # 测试示例3:1111 → 1111 num = 0b1111 isolated_ones = num & ~(num << 1) & ~(num >> 1) result = num & ~isolated_ones print(bin(result)) # 输出 0b1111
方法优势
- 左移、右移操作一次性获取所有位的相邻状态,彻底告别逐位判断的冗长代码
- 位运算属于底层操作,效率极高,无论数字位数多少都能一次性处理,无循环性能损耗
内容的提问来源于stack exchange,提问作者randomdomnar
相关产品推荐
相关产品推荐

