嵌套循环以迭代到2的幂

Nested for loops to iterate to the power of 2

本文关键字:的幂 迭代 嵌套循环      更新时间:2023-10-16

我需要使用两个循环,使外循环驱动内循环进行2、4、8、16和32次迭代的计算。

例如,如果i=2(对于外环)则内部循环将迭代4次

如果i=3则内部循环将迭代8次,依此类推

这就是我使用的逻辑

for ( i = 0 ; i < n ; i++ ) 
     {
         for ( c = 0 ; c <= pow(2,i) ; c=c++ )   

如果有任何建议,我将不胜感激。

  1. 计算一次内部循环的迭代次数,然后重用它,而不是每次都计算。

  2. 不要使用pow(2, i)。使用更可靠的1 << i

  3. 不要使用c = c++。只需使用c++。我不确定c = c++是否保证是c = c+1

for ( i = 0 ; i < n ; i++ ) 
{
   int nextCount = (1 << i);
   for ( c = 0 ; c <= nextCount ; c++ ) 

您可以使用这样一个事实,即在C++中计算2的小幂,您可以使用左移位:

for ( i = 0 ; i < n ; i++ ) {
    for ( c = 0 ; c < (1 << i) ; c++ ) {
        ...
    }
}

这种"魔术"背后的原因与在十进制数字的右边加一个零会使数字乘以10的原因相同。

请注意,由于内部循环的迭代从零开始,因此需要使用<,而不是<=。否则,您将迭代2n+1次。

你会想使用其他人建议的东西:

for (int i=0 ; i<n ; i++){
    for(int c=0 ; c < (1<<i) ; c++){
        //do computations
    }
}

您之所以要使用<而不是<=,是因为<=实际上会给您(2^i)+1次迭代,因为计数为零。

之所以要使用位移运算1<<i,是因为整数已经以2为底,在末尾加零等于重复乘以2。(1自动创建为整数,而1.0自动创建为浮点。使用浮点无法安全地执行此操作:1.0<<1位移位到1.70141e+38,如果您可以让编译器执行此操作的话。)

最后,您希望使用c++,因为c++递增c,但返回原始值,所以您的内部for循环始终保持原始值,从不递增。