public static void LongUselessLoopInt64() { Console.WriteLine($"CBitwiseOps.BitsCount : Starting self-test ({nameof(UInt64)})..."); Console.ForegroundColor = ConsoleColor.DarkGray; Console.WriteLine(); Console.CursorVisible = false; //ulong min = ulong.MinValue; //ulong max = ulong.MaxValue; const long one_step = 10_000_000; long info_sum = 0; long info_steps = 0, info_totalsteps = unchecked ((long)(ulong.MaxValue / 10_000_000UL)); Stopwatch timer = Stopwatch.StartNew(); for ( // Начало цикла: создаю кортеж (tuple), счетчик и флаг останова цикла. var loop = new LoopUInt64 { Step = ulong.MinValue, Continue = true }; // Цикл работает при условии, что флаг останова не включен. // Далее будет понятно, почему. loop.Continue; // Пост-действие цикла: // Обрабатываем флаг останова. Здесь разрешается вопрос "Выполнять // ли *следующую* итерацию цикла?". Если да, то допускаем увеличение // счетчика в этой итерации. Он достигает возможного предела для // чисел UInt64 и выполняется. Но последующая итерация завершит цикл // и арифметического переполнения не будет. loop.Continue = loop.Step < ulong.MaxValue, loop.Step = (loop.Continue) ? ++loop.Step : 0 ) { int sum = 0, i = 0; ulong value = loop.Step; while (i < sizeof(ulong) * 8) { if ((value & 1) > 0) { sum++; } value = value >> 1; i++; } // Проверка функции if (sum != CBitwiseOps.BitsCount(loop.Step)) { throw new InvalidOperationException("CBitwiseOps.BitsCount : Fatal error in lookup table"); } info_sum++; if (info_sum > one_step) { info_sum = 0; info_steps++; long elapsed_ms = timer.ElapsedMilliseconds; timer = Stopwatch.StartNew(); long sec_left = ((info_totalsteps - info_steps) * elapsed_ms) / 1000; long yrs_left = sec_left / 60 / 60 / 24 / 365; sec_left -= (yrs_left * 365 * 24 * 60 * 60); long day_left = sec_left / 60 / 60 / 24; sec_left -= (day_left * 24 * 60 * 60); long hrs_left = sec_left / 60 / 60; sec_left -= (hrs_left * 60 * 60); long min_left = sec_left / 60; Console.WriteLine("".PadLeft(Console.BufferWidth - 1, ' ')); Console.CursorTop--; Console.CursorTop--; string info = $"{(info_steps / (info_totalsteps + 0.0f)) * 100:000.000}% " + $"({info_steps}0M from {info_totalsteps}0M), remaining time ~ " + $"{yrs_left:0}:{day_left:00}:{hrs_left:00}:{min_left :00} y:d:h:m"; Console.WriteLine(info.Substring(0, Math.Min(Console.BufferWidth, info.Length))); } } Console.CursorVisible = true; Console.ResetColor(); Console.WriteLine($"CBitwiseOps.BitsCount : Self-test completed ({nameof(UInt64)})."); }
public static void LongUselessLoopInt32() { Console.WriteLine($"CBitwiseOps.BitsCount : Starting self-test ({nameof(UInt32)})..."); Console.ForegroundColor = ConsoleColor.DarkGray; Console.WriteLine(""); const uint one_step = 1_000_000U; int info_sum = 0; uint info_steps = 0, info_totalsteps = uint.MaxValue / one_step; Stopwatch timer = Stopwatch.StartNew(); unchecked { for (uint b = 0; b <= uint.MaxValue; b++) { int sum = 0, i = 0; uint value = b; while (i < sizeof(uint) * 8) { if ((value & 1) > 0) { sum++; } value = value >> 1; i++; } // Проверка функции if (sum != CBitwiseOps.BitsCount(b)) { throw new InvalidOperationException("CBitwiseOps.BitsCount : Fatal error in lookup table"); } info_sum++; if (info_sum > one_step) { info_sum = 0; info_steps++; long elapsed_ms = timer.ElapsedMilliseconds; timer = Stopwatch.StartNew(); long sec_left = ((info_totalsteps - info_steps) * elapsed_ms) / 1000; long yrs_left = sec_left / 60 / 60 / 24 / 365; sec_left -= (yrs_left * 365 * 24 * 60 * 60); long day_left = sec_left / 60 / 60 / 24; sec_left -= (day_left * 24 * 60 * 60); long hrs_left = sec_left / 60 / 60; sec_left -= (hrs_left * 60 * 60); long min_left = sec_left / 60; Console.WriteLine("".PadLeft(Console.BufferWidth - 1, ' ')); Console.CursorTop--; Console.CursorTop--; string info = $"{(info_steps / (info_totalsteps + 0.0f)) * 100:000.000}% " + $"({info_steps}0M from {info_totalsteps}0M), remaining time ~ " + $"{yrs_left:0}:{day_left:00}:{hrs_left:00}:{min_left :00} y:d:h:m"; Console.WriteLine(info.Substring(0, Math.Min(Console.BufferWidth, info.Length))); } } } Console.ResetColor(); Console.WriteLine($"CBitwiseOps.BitsCount : Self-test completed ({nameof(UInt32)})."); }