[personal profile] a7sharp9

Что делает Серьёзный Программист (далее - СП), когда ему нужно разделить целое число пополам? Конечно, использует оператор сдвига на один бит вправо.

Что делает тот же самый СП, когда ему нужно увеличить число в полтора раза? Выливает воду из чайника, смотри предыдущую задачу: берёт уполовиненное число и складывает его с собой.

Выглядит это так:

x = x + x >> 1;

К сожалению, эта строчка находится в куске кода, который решает, на сколько увеличить размер расширяемого массива при релокации.
К ещё большему сожалению, в этом куске кода (потому что П - С, и он учитывает краевые ситуации) имеется также обработка случая, когда x==1, состоящая в том, что если x не изменился, его следует увеличить на единицу.

Таким образом, поскольку приоритет у плюса больше, чем у сдвига (а на приоритеты операций СП никогда внимания не обращают), строчка не имеет никакого эффекта вообще (x умножили и тут же разделили на 2), срабатывает краевой случай, и массив переезжает в памяти с каждым новым элементом.

Программа вместо двух часов работает трое суток, замедляясь всё больше, и до конца так и не доходит.

Люди, умножайте на полтора.

Date: 2005-03-15 07:07 pm (UTC)
From: [identity profile] kuzjavyj.livejournal.com
Иэх, красота какая.

Date: 2005-03-15 09:41 pm (UTC)
From: [identity profile] zhenyach.livejournal.com
При том, что с появлением первого Пентиума нужда в подобных извращениях отпала - что сдвиг, что деление делаются за один такт. Не говоря уже о том, что оптимизирующий компилятор и раньше догадывался, как правильнее делить на два.

Date: 2005-03-16 05:38 am (UTC)
From: [identity profile] satangel.livejournal.com
это очень правильный подход

еще более интересно было бы написать х = х>>1 + x

хотя это какой-то неленивый СП - если б он поленился и написал как нужно было изначально:
х += х>>1
все бы работало, а исходник был бы на 2 байта меньше... :)

вот после таких деятелей, которые текст не комментируют а сопроводительную записку пишут на японском проекты и умирают....

December 2018

S M T W T F S
      1
2345678
9101112131415
161718192021 22
23242526272829
3031     

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Mar. 31st, 2026 03:42 pm
Powered by Dreamwidth Studios