给定一个实数(n),这个实数可以是(上)的最大值,这个实数可以是(更低)的最小值,我们怎样才能最有效地剪切n,使它保持在低位和高位之间?
当然,使用一堆if语句可以做到这一点,但那很无聊!更紧凑,优雅/有趣的解决方案呢?
我自己的快速尝试(C/C++):
float clip( float n, float lower, float upper )
{
n = ( n > lower ) * n + !( n > lower ) * lower;
return ( n < upper ) * n + !( n < upper ) * upper;
}
Run Code Online (Sandbox Code Playgroud)
我确信还有其他更好的方法可以做到这一点,这就是为什么我把它放在那里......!
假设我正在编写一个API,我的一个函数采用一个代表一个通道的参数,并且只会在值0和15之间.我可以这样写:
void Func(unsigned char channel)
{
if(channel < 0 || channel > 15)
{ // throw some exception }
// do something
}
Run Code Online (Sandbox Code Playgroud)
或者我是否利用C++作为强类型语言,并使自己成为一种类型:
class CChannel
{
public:
CChannel(unsigned char value) : m_Value(value)
{
if(channel < 0 || channel > 15)
{ // throw some exception }
}
operator unsigned char() { return m_Value; }
private:
unsigned char m_Value;
}
Run Code Online (Sandbox Code Playgroud)
我的功能现在变为:
void Func(const CChannel &channel)
{
// No input checking required
// do something
}
Run Code Online (Sandbox Code Playgroud)
但这总是矫枉过正吗?我喜欢自我记录,并保证它是它所说的,但它是否值得支付这样一个对象的构造和破坏,更不用说所有额外的打字?请让我知道您的意见和备选方案.
我正在优化瓶颈代码:
int sum = ........
sum = (sum >> _bitShift);
if (sum > 32000)
sum = 32000; //if we get an overflow, saturate output
else if (sum < -32000)
sum = -32000; //if we get an underflow, saturate output
short result = static_cast<short>(sum);
Run Code Online (Sandbox Code Playgroud)
我想将饱和条件写为一个"if condition",或者甚至更好,没有"if condition"来使这段代码更快.我不需要精确饱和值为32000,任何类似的值如32768都是可以接受的.
根据此页面,ARM中有一个饱和指令.在x86/x64中有类似的东西吗?
我想知道是否有一些内置的钳位方法可以钳制一个范围之间的值,比如在 (0,1) 之间?
clamp(a) = a if a is in (0,1)
a < 0 a = 0
a > 1 a = 1
Run Code Online (Sandbox Code Playgroud)