存储n整数所需的最小,最大位数

时间:2013-10-20 04:53:43

标签: python

我的老师做了一个例子,他向我们展示了一些样本输出,我试图找出他是如何获得数字的。这是他的样本输出

          unsigned     max value  max value
number     b bits      b-1 bits   b bits
     2       2           1           3
    10       4           7          15
    20       5          15          31
   100       7          63         127
  1000      10         511        1023
999999      20      524287     1048575
他说他找到了 将n存储为无符号整数所需的最小位数b •可以使用b-1位存储的最大无符号整数 •可使用b位

存储的最大无符号整数

有没有这样做的公式,因为我似乎无法识别模式

3 个答案:

答案 0 :(得分:2)

n位中,您可以存储一个数字(2^n)-1 1 。这是二进制数。如果您使用的是base-2号码系统,那么您可以将数字8表示为:

100 # 1*2^3 + 0*2^2 + 0*2^1

或数字12为:

110 # 1*2^3 + 1*2^2 + 0*2^1

1 为了记录,我在这里使用白话^作为取词。 Python实际上使用不同的运算符(**)。 (^可能是从C)借来的。

答案 1 :(得分:2)

使用int.bit_length()

>>> (999999).bit_length()
20
>>> b = (999999).bit_length()
>>> 1 << b
1048576
>>> (1 << b) - 1
1048575

或使用log 2

>>> import math
>>> math.ceil(math.log(999999, 2))
20.0

或使用二进制表示法:

>>> format(999999, 'b')
'11110100001000111111'
>>> len(format(999999, 'b'))
20
>>> int('1' * 20, 2)
1048575

>>> bin(999999)
'0b11110100001000111111'
>>> len(bin(999999)) - 2
20

答案 2 :(得分:0)

这会输出你在课堂上展示的内容:

import math

def calcNumbers(num):
    result = []
    b = int(math.ceil(math.log(num + 1, 2)))
    result.append(num)
    result.append(b)
    result.append(2**(b-1)-1)    # a**b is the same as a^b
    result.append(2**b-1)
    return tuple(result)

nums = [2, 10, 20, 100, 1000, 999999]

print '       |Unsigned|Max Value|Max Value'
print 'Number | b bits | b-1 bits| b bits'

for num in nums:
    print '% 7d|% 8d|% 8d |% 8d' % calcNumbers(num)

 # output
 #          |Unsigned|Max Value|Max Value
 #   Number | b bits | b-1 bits| b bits
 #         2|       2|       1 |       3
 #        10|       4|       7 |      15
 #        20|       5|      15 |      31
 #       100|       7|      63 |     127
 #      1000|      10|     511 |    1023
 #    999999|      20|  524287 | 1048575