Python中正整数的位长度

时间:2010-04-16 15:23:28

标签: python bits bitcount

1 = 0b1 -> 1
5 = 0b101 -> 3
10 = 0b1010 -> 4
100 = 0b1100100 -> 7
1000 = 0b1111101000 -> 10
…

如何获得整数的位长,即在Python中表示正整数所需的位数?

8 个答案:

答案 0 :(得分:162)

在python 2.7+中有一个int.bit_length()方法:

>>> a = 100
>>> a.bit_length()
7

答案 1 :(得分:21)

>>> len(bin(1000))-2
10
>>> len(bin(100))-2
7
>>> len(bin(10))-2
4

注意:对于负数不起作用,可能需要减去3而不是2

答案 2 :(得分:1)

如果您的Python版本具有它(Python2≥2.7,Python 3则≥3.1),请使用标准库中的bit_length方法。

否则,len(bin(n))-2 as suggested by YOU很快(因为它是在Python中实现的)。请注意,这将返回0表示0。

否则,一个简单的方法是重复除以2(这是一个简单的位移),并计算达到0所需的时间。

def bit_length(n): # return the bit size of a non-negative integer
    bits = 0
    while n >> bits: bits += 1
    return bits

它显着更快(至少对于大数字 - 快速基准测试说1000个数字快10倍以上)一次移动整个单词,然后返回并处理最后一个单词的位。 / p>

def bit_length(n): # return the bit size of a non-negative integer
    if n == 0: return 0
    bits = -32
    m = 0
    while n:
        m = n
        n >>= 32; bits += 32
    while m: m >>= 1; bits += 1
    return bits

在我的快速基准测试中,len(bin(n))的出现速度明显快于单词大小的版本。尽管bin(n)构建了一个立即被丢弃的字符串,但由于内部循环被编译为机器代码,因此它出现在顶部。 (math.log甚至更快,但这并不重要,因为它是错误的。)

答案 3 :(得分:1)

在这里,我们还可以使用切片:

len(bin(1)[2:])
len(bin(5)[2:])
len(bin(10)[2:])
len(bin(100)[2:])
len(bin(1000)[2:])

将打印:

1
3
4
7
10

答案 4 :(得分:0)

这是另一种方式:

def number_of_bits(n):
    return len('{:b}'.format(n))

我认为效率不高,但不会出现在以前的任何答案中......

答案 5 :(得分:-1)

def bitcounter(n):
    return math.floor(math.log(n,2)) + 1

编辑已修复,因此可以使用1

答案 6 :(得分:-1)

此解决方案利用.bit_length()(如果可用),对于旧版本的Python,可以回退到len(hex(a))。它优于bin,它创建一个较小的临时字符串,因此它使用较少的内存。

请注意,它会为0返回1,但这很容易更改。

_HEX_BIT_COUNT_MAP = {
    '0': 0, '1': 1, '2': 2, '3': 2, '4': 3, '5': 3, '6': 3, '7': 3}

def bit_count(a):
  """Returns the number of bits needed to represent abs(a). Returns 1 for 0."""
  if not isinstance(a, (int, long)):
    raise TypeError
  if not a:
    return 1
  # Example: hex(-0xabc) == '-0xabc'. 'L' is appended for longs.
  s = hex(a)
  d = len(s)
  if s[-1] == 'L':
    d -= 1
  if s[0] == '-':
    d -= 4
    c = s[3]
  else:
    d -= 3
    c = s[2]
  return _HEX_BIT_COUNT_MAP.get(c, 4) + (d << 2)


# Use int.bit_length and long.bit_length introduced in Python 2.7 and 3.x.
if getattr(0, 'bit_length', None):
  __doc = bit_count.__doc__
  def bit_count(a):
    return a.bit_length() or 1
  bit_count.__doc__ = __doc

assert bit_count(0) == 1
assert bit_count(1) == 1
assert bit_count(2) == 2
assert bit_count(3) == 2
assert bit_count(63) == 6
assert bit_count(64) == 7
assert bit_count(75) == 7
assert bit_count(2047) == 11
assert bit_count(2048) == 12
assert bit_count(-4007) == 12
assert bit_count(4095) == 12
assert bit_count(4096) == 13
assert bit_count(1 << 1203) == 1204
assert bit_count(-(1 << 1203)) == 1204
assert bit_count(1 << 1204) == 1205
assert bit_count(1 << 1205) == 1206
assert bit_count(1 << 1206) == 1207

答案 7 :(得分:-1)

只需将值存储在变量中并访问bit_length()即可。适用于Python 2和3。

n = 5
print(n.bit_length())