【问题标题】:Python find max number of combinations in binaryPython在二进制中找到最大组合数
【发布时间】:2013-12-12 13:10:50
【问题描述】:

您好,我正在尝试找出一个函数,其中给定列表 [x1, x2... xn] 的长度 n,基数为 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,等等。

【问题讨论】:

  • 您正在寻找的是数学函数 log base 2(向上取整)。你可以找到一堆不同的数学库来为你做这件事。
  • x = int(log(n,2))+1 - 这将为您提供所需的位数。
  • @Mr.Polywhirl:注意math.log 有一个可选的base 参数。
  • @Warren 抱歉,我想保证安全。上周我使用了大约 5 种语言……我应该检查一下文档。

标签: python list binary


【解决方案1】:
>>> 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 项目,那么您可以使用 0 到 @987654332 中的 n 整数为它们分配唯一代码@ 包括的。这需要多少位?用二进制表示n-1(最大的代码)所需的位数。我希望这使答案显而易见而不是神秘;-)

正如 cmets 指出的那样,n=1 的论点变得紧张。那是一个怪癖(0).bit_length() == 0。所以要小心那个!

【讨论】:

  • 有趣的函数...实际上,OP 错了,python 错了 :)。它确实需要 3 位来存储 4 - 100。-而且这比我认为的使用日志更 Pythonic(和高效)。
  • @korylprince,这就是数字 4,2 位足够 4 个items
  • @korylprince,是的,但我认为这不是 OP 真正想要的。
  • @gnibbler 啊是的,我现在看到了。
  • 我想是(i-1).bit_length()
【解决方案2】:

使用以下 -

import math
int(math.ceil(math.log(x,2)))

其中x 是列表长度。

编辑:

对于x = 1,我们需要有一个单独的案例来返回1。感谢@thefourtheye 指出这一点。

【讨论】:

  • 我认为这也是错误的。当x == 1 时,返回0。 OP 想知道分配唯一代码所需的位数。他如何分配一个0位数的唯一代码?
  • @thefourtheye 需要单独介绍。
【解决方案3】:

我对其他答案不满意,因为它们中的大多数在极端情况下都失败了(当 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

【讨论】:

  • 糟糕!检查我的编辑:你在最后一部分有return return,我删除了其中一个。但也许你的意思是else: return
  • @TimPeters 哦,是的。谢谢蒂姆:)
【解决方案4】:
x = int(log(n,2))+1

x 将是存储整数值n 所需的位数。

【讨论】:

    【解决方案5】:

    如果由于某种原因您不想使用.bit_length,这里有另一种查找方法。

    from itertools import count
    def calcBitDigits(n):
        return next(i for i in count() if 1<<i >= n)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-04
      • 1970-01-01
      • 1970-01-01
      • 2012-10-08
      • 2021-02-18
      • 1970-01-01
      • 1970-01-01
      • 2021-01-13
      相关资源
      最近更新 更多