Господа! Без нервов) (i >> 1) + (j >> 1) - есть неверный результат) Целиком и полностью согласен) Взят из другой оперы, но очень близкой, такой что человек с мозгами в результате может исключить операцию деления почти для любого знаменателя. В случае двух слагаемых дополните единицей и все) как ее взять? посмотрите на слагаемые, проверьте их четность) Богом клянусь, не хотел тут вводить кого-либо в заблуждение)
Ну пиво пьем, что поделать)
Далее, вопрос про среду исполнения, ну это мега вопрос) Кто сказал, что, например, уважаемая всеми корпорация IBM в своей среде исполнения учтет деление на 2, и разумно заменит div shift-ом?))) Это крайне спорно. А кто сказал, что уважаемая Sun это сделала? А если ту же операцию проводить для Int64?))
(Оффтоп)
Идем далее, пример: (извините, код не оформлен, сваял только что студент)
namespace InterceptorsMediaLab
{
static class Program
{
// Метод быстрый [Fast]
private static void Fast()
{
global::System.Int32 value = 0;
global::System.Int64 ticks = global::System.DateTime.Now.Ticks;
for (global::System.Int32 a = 1; a < 100000; a++)
for (global::System.Int32 b = 1; b < 100000; b++)
// -----------
value = (a + b) >> 1;
ticks = global::System.DateTime.Now.Ticks - ticks;
global::System.Console.WriteLine(global::System.String.Format("Fast {0} {1}", ticks, value));
}
// Метод тупой [Stpd]
private static void Stpd()
{
global::System.Int32 value = 0;
global::System.Int64 ticks = global::System.DateTime.Now.Ticks;
for (global::System.Int32 a = 1; a < 100000; a++)
for (global::System.Int32 b = 1; b < 100000; b++)
// -----------
value = (a + b) / 2;
ticks = global::System.DateTime.Now.Ticks - ticks;
global::System.Console.WriteLine(global::System.String.Format("Stpd {0} {1}", ticks, value));
}
static void Main()
{
global::System.Console.Write("Press enter...");
global::System.Console.ReadLine();
for (global::System.Int32 i = 0; i < 5; i++)
{
Fast();
Stpd();
}
global::System.Console.Write("Finished...");
global::System.Console.ReadLine();
}
}
}
Результаты катастрофические:
Press enter...
Fast 150625000 99999
Stpd 250937500 99999
Fast 150468750 99999
Stpd 250937500 99999
Fast 150468750 99999
Stpd 250937500 99999
Fast 150468750 99999
Stpd 250937500 99999
Fast 150625000 99999
Stpd 250781250 99999
Finished...
Вот и пища для ума)
Кого обидел, а вроде никто особо и не обиделся, извините)
P.S. XP Framework3.5 32bit VS2008, сам давно все излазил, дамп одинаков, понять не могу.