Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 通过数字中的最高阶位向后循环_Python_Optimization_Set_Bit Manipulation - Fatal编程技术网

Python 通过数字中的最高阶位向后循环

Python 通过数字中的最高阶位向后循环,python,optimization,set,bit-manipulation,Python,Optimization,Set,Bit Manipulation,我有一个函数,它接收一个整数并返回一个由2的幂组成的集合,其和等于输入值: def bin_set(n): b = set() while n: hbit = 1 << n.bit_length()-1 b.add(hbit) n -= hbit return b def bin_集(n): b=集合() 而n: hbit=1该方法效果良好;使用减法从n中删除检测到的位,直到删除所有位。因此,n.bit_len

我有一个函数,它接收一个整数并返回一个由2的幂组成的集合,其和等于输入值:

def bin_set(n):
    b = set()
    while n:
        hbit = 1 << n.bit_length()-1
        b.add(hbit)
        n -= hbit
    return b
def bin_集(n):
b=集合()
而n:

hbit=1该方法效果良好;使用减法从
n
中删除检测到的位,直到删除所有位。因此,
n.bit_length()
结果也会减少

您可以使用XOR(异或运算符)来清除高位,而不是减法:

def bin_set(n):
    b = set()
    while n:
        hbit = 1 << n.bit_length() - 1
        b.add(hbit)
        n ^= hbit
    return b
但这实际上做了更多的测试

您的版本只循环
n
中设置的位的次数,但每次迭代都会计算位计数,而上面的版本循环
n.bit_length()
int.bit_length()
计算位长度需要O(N)个平均时间,因此您需要O(KN)个时间从N个位生成K值集,移动高位需要O(N)个时间


这使我的版本渐进地变得更好,但因为
int.bit_length()
方法在C中完成了这项工作,并将循环减少到每4位只进行一次循环迭代,所以它并不像听起来那么糟糕。在看到我赢之前,你需要大量的数据

您可以使用一种称为a的方法,这是一种非常简洁的方法来创建它们

def bin_set(n):
    return {1 << p for p in xrange(n.bit_length()-1, -1, -1) if n & 1 << p}

print bin_set(0)   # --> set([])          
print bin_set(10)  # --> set([8, 2])      
print bin_set(12)  # --> set([8, 4])      
print bin_set(15)  # --> set([8, 1, 2, 4])
def bin_集(n):
返回{1集([8,2])
打印bin_set(12)#-->set([8,4])
打印仓位集(15)——>集([8,1,2,4])

谢谢,不知何故,我没有想到使用XOR来取消位的设置,我更喜欢它!我实际上测试了第二个循环,在我看来,至少还需要一次迭代,尽管我想不出一个好的最坏情况。@cbq:最坏情况:设置了所有位的非常大的整数。
19342813113834066795298815。
def bin_set(n):
    return {1 << p for p in xrange(n.bit_length()-1, -1, -1) if n & 1 << p}

print bin_set(0)   # --> set([])          
print bin_set(10)  # --> set([8, 2])      
print bin_set(12)  # --> set([8, 4])      
print bin_set(15)  # --> set([8, 1, 2, 4])