嗨我正在尝试找出一个函数,其中给定列表的长度n [x1,x2 ... xn],基数2数字系统需要多少位数来为每个数字分配一个唯一的代码列表中的值。
例如,一个数字可以包含两个唯一值:
x1 0
x2 1
两位数可以容纳四位:
x1 00
x2 01
x3 10
x4 11
等。我正在尝试编写一个python函数calcBitDigits(myListLength),它接受此列表长度并返回所需的位数。 calcBitDigits(2)= 1,calcBitDigits(4)= 2,calcBitDigits(3)= 2等。
答案 0 :(得分:7)
>>> for i in range(10):
... print i, i.bit_length()
0 0
1 1
2 2
3 2
4 3
5 3
6 3
7 3
8 4
9 4
我不清楚你想要什么,但出现你要从bit_length()
返回的东西中减去1 - 或者不是; - )
第三个想法;-),也许你真的想要这个:
def calcBitDigits(n):
return (n-1).bit_length()
至少在你给出的每个例子中给出你想要的结果。
注意:对于整数n
> 0,n.bit_length()
是表示二进制n
所需的位数。 (n-1).bit_length()
实际上是一种更快的计算方法int(math.ceil(math.log(n, 2)))
。
澄清:我现在理解原始问题;-)以下是如何思考答案:如果您有n
个项目,那么您可以使用n
中的0
整数为它们分配唯一代码1}}到n-1
包含。这需要多少位?表示二进制中n-1
(最大代码)所需的位数。我希望这个答案显而易见而不是神秘; - )
正如评论所指出的那样,n=1
的论点变得紧张。那是(0).bit_length() == 0
的怪癖。所以要小心那个!
答案 1 :(得分:3)
使用以下内容 -
import math
int(math.ceil(math.log(x,2)))
其中x
是列表长度。
编辑:
对于x = 1
,我们需要一个单独的案例,返回1
。谢谢@thefourtheye指出这一点。
答案 2 :(得分:1)
我对其他答案感到不舒服,因为大多数答案在角落情况下失败(当n == 1时)。所以,我是根据Tim's answer写的。
def calcBitDigits(n):
if n <= 0: return 0
elif n <= 2: return 1
return (n-1).bit_length()
for i in range(10):
print i, calcBitDigits(i)
<强>输出强>
0 0
1 1
2 1
3 2
4 2
5 3
6 3
7 3
8 3
9 4
答案 3 :(得分:0)
x = int(log(n,2))+1
x
将是存储整数值n
所需的位数。
答案 4 :(得分:0)
如果由于某种原因你不想使用.bit_length
,这是找到它的另一种方法。
from itertools import count
def calcBitDigits(n):
return next(i for i in count() if 1<<i >= n)