代码之家  ›  专栏  ›  技术社区  ›  Robert Deml

从0x0000到0xFFFF的循环

  •  6
  • Robert Deml  · 技术社区  · 16 年前

    我想要一个使用UInt16(ushort)循环其所有值的循环。但是,这并不能做到:

    for( ushort i = 0; i < UInt16.MaxValue; i++ )
    {
        // do something
    }
    

    问题是,当i==0xFFFF时,循环将退出,而不是“做点什么”。 如果我将“for”语句更改为“for(ushort I=0;I<=UInt16.MaxValue;I++)”,那么它将成为一个无限循环,因为我永远无法到达0x10000,因为ushort只转到0xFFFF。

    有什么建议吗?

    5 回复  |  直到 16 年前
        1
  •  17
  •   Community CDub    8 年前

    使用 do...while

    ushort i = 0;
    do
    {
        // do something
    } while(i++ < UInt16.MaxValue);
    

    有一个有趣的关于测试循环在顶部和底部的讨论 here

        2
  •  5
  •   spoulson    16 年前

    UInt16.MaxValue evaluates to 0xffff 0x10000 . 我想你可以用一个 do / while 循环,作为布哈尔德1979答案的变体。

    ushort i = 0;
    do {
       ...
    } while (++i != 0);
    
        3
  •  4
  •   Burkhard    16 年前

    ushort i = 0;
    do
    {
    i++;
    ...
    } while(i!=UInt16.MaxValue);
    
        4
  •  1
  •   Kevin    16 年前

    它必须是短的吗?为什么不

    for(int i = 0;i<=0xFFFF;i++)
    {
      //do whatever
    }
    
        5
  •  1
  •   Paul de Vrieze    16 年前

    假设您的代码遇到了一个off by one错误(当前代码在计算最终值之前停止)。

    非常简单,因为计数器是一个16位无符号整数,它的值不能大于 0xffff ,因为该值仍然有效,所以需要有一些超出该值的值作为保护。然而,增加 1 0xffff 在16位中,仅环绕到 0 . 正如建议的那样,可以使用do while循环(不需要保护值),也可以使用更大的值来包含计数器。

    在现代机器上使用16位变量实际上比使用32位变量效率低,因为不需要生成溢出代码。