收集n的2次幂分解(Python,C ++)

时间:2013-11-25 16:34:56

标签: c++ python numbers

我正在编写一个快速程序,将一个数字分解为2的幂。这是一种有效的方法:

    pows=[]
    pos = 0
    while n>0:
        if n%2==1: pows.append(2**pos)
        n/=2
        pos+=1

我用Python编写了这个,但我也对它在C ++中是如何完成感兴趣。

我不知道这是否是一种“聪明”的方式,或者它被认为是非常低效的。

2 个答案:

答案 0 :(得分:1)

任何现代编译器都可能足够聪明以优化它。让代码首先正确运行,并担心在分析后优化速度(如果速度太慢)。

答案 1 :(得分:1)

C ++中最自然的实现将使用位掩码 两种力量,如:

std::vector<unsigned> p2;
unsigned m = 1;
while ( m != 0 ) {
    if ( (m & i) != 0 ) {
        p2.push_back( m );
    }
    m <<= 1;
}

您当然不希望每次都调用pow函数 循环。一种有点欺骗的方式,可能更快 (因为它通常在循环中传递的次数较少)将是:

std::vector<unsigned> p2;
std::cout << i << ": ";
while ( i != 0 ) {
    unsigned n = i & i - 1;
    p2.push_back( i ^ n );
    i = n;
}

我会推荐第一个(这很容易理解) 除非探查者真的说你必须使用第二个。