Этот небольшой, казалось бы, незначительный вопрос возник у меня недавно, но, немного погуглив, я не смог найти даже мнения по этому вопросу. Упоминаются только циклы и размеры объектов.
Я знаю людей, которым нравятся примеры, поэтому вот тот, который в первую очередь вызывает вопрос:
uint64_t deltaSwap( const uint64_t b, const size_t delta, uint64_t mask )
{
return b ^ mask ^ ( mask &= b ^ b >> delta ) << delta;
}
Я пытался слишком оптимизировать это на некоторое время, прекрасно зная, что это не способ написать правильный код, хотя он дал мне лучший результат до сих пор, по крайней мере, с G CC, а потом это пришло мне в голову. Если вы действительно хотите быть педанти c, разве дельта не должна иметь тип size_t
?
Я никогда не понимал, когда использовать size_t
, поэтому я никогда не делал, но если бы я Разве это не было бы правильным использованием?
Обновление: вот краткое объяснение того, что он делает, хотя не так, как это делает, поскольку я не совсем уверен, как это объяснить:
Это стандартный дельта-своп, который не является новым идеалом, и код работает нормально, на самом деле речь не идет о коде (но с тех пор, как вы спросили), и все, что я действительно сделал, это экспериментировал с ним, чтобы добиться наилучшая производительность, и версия, которую вы видите здесь, - мой лучший результат на данный момент.
Цель кода - поменять местами два или более бит, например, если вы поменяете sh на первый и последний бит, это может быть сделано так:
deltaSwap(b, 63, 0x0000000000000001);
или если вы хотите sh изменить порядок битов:
deltaSwap(b, 32, 0x00000000ffffffff);
deltaSwap(b, 16, 0x0000ffff0000ffff);
deltaSwap(b, 8, 0x00ff00ff00ff00ff);
deltaSwap(b, 4, 0x0f0f0f0f0f0f0f0f);
deltaSwap(b, 2, 0x3333333333333333);
deltaSwap(b, 1, 0x5555555555555555);
хотя для этой конкретной задачи дельта-свопы вероятно, не самый лучший способ go.
Обновление 2: просто для завершения, это я Это самый правильный лайнер, который я могу себе представить (пока не получил мой ответ), и компилятор, очевидно, оптимизирует его идеально.
uint64_t deltaSwap( const uint64_t b, const uint_fast8_t delta, const uint64_t mask )
{
return b ^ ( mask & ( b ^ b >> delta ) ) ^ ( mask & ( b ^ b >> delta ) ) << delta;
}
Я бы сократил имя переменной, чтобы она соответствовала всем 80 персонаж с навязанным моим ocd мозгом (и, видимо, этим сайтом тоже), но для всех вас я готов пострадать.