(no subject)
Mar. 15th, 2005 01:43 pmЧто делает Серьёзный Программист (далее - СП), когда ему нужно разделить целое число пополам? Конечно, использует оператор сдвига на один бит вправо.
Что делает тот же самый СП, когда ему нужно увеличить число в полтора раза? Выливает воду из чайника, смотри предыдущую задачу: берёт уполовиненное число и складывает его с собой.
Выглядит это так:
x = x + x >> 1;
К сожалению, эта строчка находится в куске кода, который решает, на сколько увеличить размер расширяемого массива при релокации.
К ещё большему сожалению, в этом куске кода (потому что П - С, и он учитывает краевые ситуации) имеется также обработка случая, когда x==1, состоящая в том, что если x не изменился, его следует увеличить на единицу.
Таким образом, поскольку приоритет у плюса больше, чем у сдвига (а на приоритеты операций СП никогда внимания не обращают), строчка не имеет никакого эффекта вообще (x умножили и тут же разделили на 2), срабатывает краевой случай, и массив переезжает в памяти с каждым новым элементом.
Программа вместо двух часов работает трое суток, замедляясь всё больше, и до конца так и не доходит.
Люди, умножайте на полтора.
no subject
Date: 2005-03-15 07:07 pm (UTC)(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2005-03-15 09:41 pm (UTC)(no subject)
From:no subject
Date: 2005-03-16 05:38 am (UTC)еще более интересно было бы написать х = х>>1 + x
хотя это какой-то неленивый СП - если б он поленился и написал как нужно было изначально:
х += х>>1
все бы работало, а исходник был бы на 2 байта меньше... :)
вот после таких деятелей, которые текст не комментируют а сопроводительную записку пишут на японском проекты и умирают....
(no subject)
From:(no subject)
From: