2

我的老师做了一个例子,他向我们展示了一些示例输出,我试图弄清楚他是如何得到这些数字的。这是他的示例输出

          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 位存储的最大无符号整数

有没有一个公式可以做到这一点,因为我似乎无法识别模式

4

3 回答 3

3

使用int.bit_length()

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

或使用日志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
于 2013-10-20T04:58:58.167 回答
2

n位为单位,您可以存储一个向上的数字(2^n)-11。是二进制数。如果您在以 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 借来的异或)。

于 2013-10-20T04:57:49.370 回答
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
于 2013-10-20T05:26:23.940 回答