我正在编写一个快速程序,将一个数字分解为2的幂。这是一种有效的方法:
pows=[]
pos = 0
while n>0:
if n%2==1: pows.append(2**pos)
n/=2
pos+=1
我用Python编写了这个,但我也对它在C ++中是如何完成感兴趣。
我不知道这是否是一种“聪明”的方式,或者它被认为是非常低效的。
答案 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;
}
我会推荐第一个(这很容易理解) 除非探查者真的说你必须使用第二个。