计算基数 2 中尾随零数的 Pythonic 方法

标签 python

我正在寻找一种 Pythonic 方法来计算正整数 n 的二进制表示中尾随零的数量(这将指示 2 的最高幂它除 n 没有余数)。

一个简单的解决方案:

def CountZeros(n):
    c = 0
    while (n % 2) == 0:
        n /= 2
        c += 1
    return c

但为了以更 Pythonic 的方式做到这一点,我认为我可以利用:

  • bin(n)[2:],它给出了n
  • 的二进制表示
  • bin(n)[:1:-1],它给出了 n
  • 的反向二进制表示

所以我的问题可以简化为计算字符串中尾随零的数量。

有没有单语句的方法来做到这一点?

我的最终目标是计算 2 的最高次方的 Pythonic 方法,它除以 n 没有余数,所以任何方法都不是通过计算尾随零来实现的字符串也很受欢迎。

最佳答案

避免使用 bin 转换为字符串的速度是原来的两倍,而是使用修改后的 bithack ,因为我们已经有了一个高效的 log2 实现。

def ctz(v):
    return (v & -v).bit_length() - 1

如果输入为 0,上面的代码返回 -1。

使用 C 使其再次快两倍:

from gmpy2 import bit_scan1 as ctz

如果输入为零,此版本返回 None。


例如,如果输入为 20,请考虑无限二进制展开:

v    000...00010100
~v   111...11101011 (not used directly, all bits opposite)
-v   111...11101100 (-v == ~v + 1; this causes all low 1 bits to overflow and carry)
v&-v 000...00000100 (has a single 1 bit, from the carry)

anded 时,所有前导零和 1 位都相反,但最后 1 位和所有尾随零在这两种方式下都相同。

然后 .bit_length() 告诉我们整数总共使用了 3 位,因此只需减去 1 即可只考虑零。

关于计算基数 2 中尾随零数的 Pythonic 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40608220/

相关文章:

python - 通过python将不同工作表中的数据从一个工作表传输到另一个工作表

python - 如何将模型对象列表转换为 Pandas 数据框?

python - 如何在 JSON 字符串中的字典中获取字典?

python - 按 Dataframe 中的位置替换数组中的元素 - Pyspark

Python 将列表的第一个元素与其余元素一起压缩

python - 频谱图 - 美白特定区域

python - 简单 NLTK 示例中的 ImportError

python - matplotlib 和seaborn : ValueError: Supply a 'c' kwarg or a 'color' kwarg but not both; they differ but their functionalities overlap

python - 如何将python屏幕输出保存到文本文件

Python:如何重用基本方法,同时允许方法内修改?