如何应用Python位操作来有效地计算整数二进制表示中连续前导1的数量。
- 比如说 *
| 伊内格尔|二进制表示|#连续的前导1|
| --|--|--|
| 0 |0b0| 0 |
| 1 |0b1| 1 |
| 2 |0b10| 1 |
| 3 |0b11| 2 |
| 4 |0b100| 1 |
| 5 |0b101| 1 |
| 6 |0b110| 2 |
| 7 |0b111| 3 |
这个问题可以通过lambda x: f"{x:b}0".index("0")
这样的字符串操作来解决,但我正在寻找一种不带字符串转换的按位操作。
1条答案
按热度按时间slmsl1lt1#
最后我自己解决了。
字符串
说明
关键的一步是反转n的位(将0的1和0的1交换)。当前导1变为0时,它们将不再作为
bit_length
的一部分被拾取。然后,我们可以通过从之前的
bit_length
减去反转后的bit_length
来计算有多少个站点被删除,这给出了出现的前导1的数量。示例
这里是0到16的前导1的计数,
型
性能测试
按位方法大约快30%。
时间是这样的
型