提问人:Robert Deml 提问时间:10/24/2008 更新时间:10/24/2008 访问量:5345
从0x0000循环到0xFFFF
Loop from 0x0000 to 0xFFFF
问:
我想要一个使用 UInt16 (ushort) 循环其所有值的循环。但是,这并不能做到这一点:
for( ushort i = 0; i < UInt16.MaxValue; i++ )
{
// do something
}
问题是,当我==0xFFFF而不是“做某事”时,循环将退出。 如果我将“for”语句更改为“for(ushort i = 0;i <= UInt16.MaxValue;i++ )“,然后它就变成了一个无限循环,因为我永远无法0x10000,因为 ushorts 只去0xFFFF。
我可以将 'i' 设为 int 并强制转换或将其分配给循环中的 ushort 变量。
有什么建议吗?
答:
17赞
Chris Marasti-Georg
10/24/2008
#1
使用循环do...while
ushort i = 0;
do
{
// do something
} while(i++ < UInt16.MaxValue);
这里有一个有趣的关于顶部和底部测试循环的讨论。
评论
0赞
Jeff Yates
10/24/2008
比我的回答好多了。:)
0赞
Ferruccio
10/24/2008
这太棒了,但不知何故令人不安;-)
0赞
warren
10/24/2008
极度令人不安;我正要取下我的 answwer,因为我犯了一个傻瓜,但倒计时也可以,是吗?喜欢 for(ushort i=UInt16.MaxValue; i>=0; i--)
0赞
Chris Marasti-Georg
10/24/2008
不,对不起,沃伦。由于 i 是无符号的,因此它永远不会小于 0。你仍然想要一个...而。
0赞
warren
10/24/2008
这就是为什么我没有说“小于”,我选择了“大于或等于”
4赞
Burkhard
10/24/2008
#2
您可以简单地将 for 替换为 do-while 循环。
ushort i = 0;
do
{
i++;
...
} while(i!=UInt16.MaxValue);
5赞
spoulson
10/24/2008
#3
UInt16.MaxValue
的计算结果为 0xffff
,而不是 .我认为你可以用 / 循环来做到这一点,作为 burkhard1979 答案的变体。0x10000
do
while
ushort i = 0;
do {
...
} while (++i != 0);
评论
1赞
Paul Hargreaves
10/24/2008
我更喜欢这个答案。更有趣!
0赞
Artelius
11/10/2008
!= 0 是多余的。但这种方法是我使用的那种东西。整数溢出 ftw!
0赞
spoulson
11/10/2008
真。我有点习惯 C#,它不会像 C/C++ 那样隐式将 int 转换为布尔值。
0赞
Burkhard
4/20/2010
由于它被标记为 C#,我认为如果没有 !=0,它将无法工作
1赞
Kevin
10/24/2008
#4
它必须是空头吗?为什么不只是
for(int i = 0;i<=0xFFFF;i++)
{
//do whatever
}
1赞
Paul de Vrieze
10/24/2008
#5
假设您的代码出现一个错误(当前代码在计算最终值之前停止。那么以下可能会回答你。
很简单,因为你的计数器是一个 16 位无符号整数,它的值不能大于 ,因为该值仍然有效,你需要有一些超出该值的值作为保护。但是,以 16 位相加只是换行到 。如建议,要么使用 do while 循环(不需要保护值),要么使用更大的值来包含计数器。0xffff
1
0xffff
0
在现代机器上使用 16 位变量实际上不如使用 32 位变量效率高,因为不需要生成溢出代码。
评论