关于《Hacker's Delight》中x & (x-1)位操作的Python实现疑问
关于《Hacker's Delight》中
x & (x-1)的问题解答 代码错误修正
你写的Python代码犯了关键错误:把按位与运算符&写成了逻辑与运算符and,这两个操作完全不同。
正确代码应为:
bin(0b1011000 & (0b1011000 - 1))
运行后会得到'0b1010000',和书中示例的转换(01011000 → 01010000)完全一致,这才是正确结果。你之前用and得到的'0b1010111'是逻辑运算的结果,和按位运算无关,属于错误输出。
去掉前缀「b」后的错误原因
你提到去掉前缀「b」后得到奇怪结果,本质是Python的语法规则:以0开头的数字会被解析为八进制数,而非二进制。比如01011000是八进制数,转十进制为270336,计算270336 & (270336-1)自然会得到完全偏离预期的二进制结果'0b11110110110100110111'。如果要写二进制数,必须加0b前缀,或直接用十进制数计算后转二进制。
x & (x-1)的实用场景
这个位操作是经典的位运算技巧,常见用途包括:
- 判断是否为2的幂:当
x != 0时,若x & (x-1) == 0,则x是2的幂(因为2的幂二进制只有一个1位,去掉后直接变为0)。 - 统计二进制中1的个数:循环执行
x = x & (x-1)直到x变为0,循环次数就是二进制里1的位数。 - 快速重置状态位:在处理位掩码、硬件寄存器等场景时,快速清零最右侧的1位,用于状态切换或标记清除。
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

