Schleife von 0x0000 bis 0xFFFF
Frage
Ich möchte eine Schleife, die einen UInt16 (ushort) eine Schleife durch alle seine Werte verwendet. Allerdings bedeutet dies nicht tun:
for( ushort i = 0; i < UInt16.MaxValue; i++ )
{
// do something
}
Das Problem ist, dass die Schleife wird beendet, wenn i == 0xFFFF und nicht „etwas tun“. Wenn ich die 'für' Aussage ändern, um "für (ushort i = 0; i <= UInt16.MaxValue; i ++)"., Dann ist es eine Endlosschleife wird, weil ich nie nur weil ushorts 0xFFFF gehen zu 0x10000 bekommt
könnte ich 'i' ein int und werfe es oder es zu einer ushort Variable in der Schleife zugeordnet werden.
Irgendwelche Vorschläge?
Lösung
Verwenden Sie eine do...while
Schleife
ushort i = 0;
do
{
// do something
} while(i++ < UInt16.MaxValue);
Es gibt eine interessante Diskussion über Tests an der Spitze im Vergleich zu dem unteren Schleifen hier .
Andere Tipps
UInt16.MaxValue
wertet 0xffff
, nicht 0x10000
. Ich glaube, Sie können dies tun, mit einer do
/ while
Schleife, als eine Variation auf burkhard1979 Antwort.
ushort i = 0;
do {
...
} while (++i != 0);
Sie können einfach die ersetzen für eine do-while-Schleife.
ushort i = 0;
do
{
i++;
...
} while(i!=UInt16.MaxValue);
muss es eine kurze sein? warum nicht einfach
for(int i = 0;i<=0xFFFF;i++)
{
//do whatever
}
Unter der Annahme, dass der Code durch einen Fehler von einem Aus leidet (die aktuelle Code, stoppt kurz vor dem endgültigen Wert ausgewertet hat. Dann wird die folgende könnten Sie beantworten.
Sehr einfach, als Zähler ein 16-Bit-Integer ohne Vorzeichen ist, kann es nicht haben Werte größer als 0xffff
, da dieser Wert noch gültig ist, müssen Sie einen Wert haben, der darüber hinaus als Wache erstreckt. Jedoch Zugabe 1
in 16 Bit 0xffff
nur umschlingt 0
. Wie vorgeschlagen, entweder ein Verwenden while-Schleife (das nicht einen Schutzwert benötigen) oder einen größeren Wert verwenden, um Ihre Zähler zu enthalten.
ps. Mit 16-Bit-Variablen auf moderne Maschinen ist tatsächlich weniger effizient als die Verwendung von 32-Bit-Variablen wie kein Überlauf-Code generiert werden muss.