gpt4 book ai didi

python - 获取 1 位在 python Long 对象中的位置

转载 作者:行者123 更新时间:2023-11-28 22:19:37 25 4
gpt4 key购买 nike

假设我在 python 2.7 中有一个非常非常大的 python 整数(尽管如果需要,我不介意切换到 python 3)。

比说的更大的东西,2^100000。

找到二进制序列中所有 1 的位置的最快方法是什么? (例如:24 将是 11000 ---> = [4,5](或 [5,4]。我不关心顺序)

目前我正在使用:

sum = whatever_starting_number

while 1:
val = sum.bit_length()-1
sum -= 2**val
mylist.append(val)
if sum == 0:
break

这没问题,但它比只取 log2 并重复减去它快不了多少。其实我想做的只是看位,跳过零,记录1的位置,甚至不需要修改原始值。

编辑:得到多个答案,真的很感激。我将在几次 timeit 测试中实现它们,并将在明天更新结果。

最佳答案

可能不是最快的解决方案,但相当简单并且看起来足够快(2^1M 是即时的)。

bits = []
for i, c in enumerate(bin(2**1000000)[:1:-1], 1):
if c == '1':
bits.append(i)

以防万一 [:1:-1] 不清楚,它被称为“扩展切片”,更多信息在这里:https://docs.python.org/2/whatsnew/2.3.html#extended-slices .

编辑:我决定对答案中发布的 3 个解决方案进行计时,结果如下:

import timeit


def fcn1():
sum = 3**100000
one_bit_indexes = []
index = 0
while sum: # returns true if sum is non-zero
if sum & 1: # returns true if right-most bit is 1
one_bit_indexes.append(index)
sum >>= 1 # discard the right-most bit
index += 1
return one_bit_indexes


def fcn2():
number = 3**100000
bits = []
for i, c in enumerate(bin(number)[:1:-1], 1):
if c == '1':
bits.append(i)
return bits


def fcn3():
sum = 3**100000
return [i for i in range(sum.bit_length()) if sum & (1<<i)]


print(timeit.timeit(fcn1, number=1))
print(timeit.timeit(fcn2, number=1))
print(timeit.timeit(fcn3, number=1))

对于 3^100k:
fcn1: 0.7462488659657538
fcn2: 0.02108444197801873
fcn3: 0.40482770901871845

对于 3^1M:
fcn1: 70.9139410170028
fcn2: 0.20711017202120274
fcn3: 43.36111917096423

关于python - 获取 1 位在 python Long 对象中的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49592295/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com