Python 中正整数所需的最小位长度
1 = 0b1 -> 1
5 = 0b101 -> 3
10 = 0b1010 -> 4
100 = 0b1100100 -> 7
1000 = 0b1111101000 -> 10
…
如何获得整数的位长度,即在Python中表示正整数所需的位数?
1 = 0b1 -> 1
5 = 0b101 -> 3
10 = 0b1010 -> 4
100 = 0b1100100 -> 7
1000 = 0b1111101000 -> 10
…
How can I get the bit length of an integer, i.e. the number of bits that are necessary to represent a positive integer in Python?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
在 python 2.7+ 中,有一个
int.bit_length()
方法:
In python 2.7+ there is a
int.bit_length()
method:注意:不适用于负数,可能需要减去 3 而不是 2
Note: will not work for negative numbers, may be need to substract 3 instead of 2
如果您的 Python 版本有它(Python 2 ≥2.7,Python 3 ≥3.1),请使用 标准库中的
bit_length
方法。否则,
len(bin(n))-2
按照您的建议很快(因为它是用Python实现的)。请注意,这对于 0 返回 1。否则,一个简单的方法是重复除以 2(这是一个简单的位移位),并计算达到 0 所需的时间。
它的速度要快得多(至少对于大数 —快速基准测试表明,对于 1000 位数字,速度要快 10 倍以上),一次按整个单词进行移位,然后返回并处理最后一个单词的位。
在我的快速基准测试中,
len(bin(n))
的速度甚至比字大小的块版本还要快得多。尽管 bin(n) 构建的字符串会立即被丢弃,但由于具有编译为机器代码的内部循环,因此它排在了首位。 (math.log
甚至更快,但这并不重要,因为它是错误的。)If your Python version has it (≥2.7 for Python 2, ≥3.1 for Python 3), use the
bit_length
method from the standard library.Otherwise,
len(bin(n))-2
as suggested by YOU is fast (because it's implemented in Python). Note that this returns 1 for 0.Otherwise, a simple method is to repeatedly divide by 2 (which is a straightforward bit shift), and count how long it takes to reach 0.
It is significantly faster (at least for large numbers — a quick benchmarks says more than 10 times faster for 1000 digits) to shift by whole words at a time, then go back and work on the bits of the last word.
In my quick benchmark,
len(bin(n))
came out significantly faster than even the word-sized chunk version. Althoughbin(n)
builds a string that's discarded immediately, it comes out on top due to having an inner loop that's compiled to machine code. (math.log
is even faster, but that's not important since it's wrong.)这里我们也可以使用切片。
对于正整数,我们从 2: 开始,
它将打印:
对于负整数,我们从 3: 开始,
它将打印:
Here we can also use slicing.
For positive integers, we'd start from 2:
which would print:
For negative integers, we'd start from 3:
which would print:
编辑已修复,以便它适用于 1
EDIT fixed so that it works with 1
这是另一种方式:
我认为效率不高,但没有出现在以前的任何答案中......
Here is another way:
Not so efficient I suppose, but doesn't show up in any of the previous answers...
此解决方案利用
.bit_length()
(如果可用),并回退到len(hex(a))
对于旧版本的 Python。与bin
相比,它的优点是它创建的临时字符串更小,因此使用的内存更少。请注意,它对于 0 返回 1,但这很容易更改。
This solution takes advantage of
.bit_length()
if available, and falls back tolen(hex(a))
for older versions of Python. It has the advantage overbin
that it creates a smaller temporary string, so it uses less memory.Please note that it returns 1 for 0, but that's easy to change.