我的老师做了一个例子,他向我们展示了一些样本输出,我试图找出他是如何获得数字的。这是他的样本输出
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位存储的最大无符号整数
有没有这样做的公式,因为我似乎无法识别模式
答案 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)
>>> (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