Код: Выделить всё
inline int32 imax( int32 a, int32 b )
{
// signed for arithmetic shift
int32 mask = a - b;
// mask < 0 means MSB is 1.
return a + ( ( b - a ) & ( mask >> 31 ) );
}
Шаг >>31, конечно, работает только для int32, и хотя я мог скопировать перегрузки функции для int8, int16, и int64, похоже, мне следует использовать вместо этого функцию шаблона. Но как мне получить размер аргумента шаблона в битах?
Есть ли лучший способ сделать это, чем этот? Могу ли я принудительно подписать маску T? Если T не имеет знака, шаг сдвига маски не будет работать (поскольку это будет логический, а не арифметический сдвиг).
Код: Выделить всё
template< typename T >
inline T imax( T a, T b )
{
// how can I force this T to be signed?
T mask = a - b;
// I hope the compiler turns the math below into an immediate constant!
mask = mask >> ( (sizeof(T) * 8) - 1 );
return a + ( ( b - a ) & mask );
}
Подробнее здесь: https://stackoverflow.com/questions/514 ... n-function
Мобильная версия