相关疑难解决方法(0)

剪辑数字最有效/优雅的方式?

给定一个实数(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)

我确信还有其他更好的方法可以做到这一点,这就是为什么我把它放在那里......!

c++ algorithm math logic

47
推荐指数
7
解决办法
6万
查看次数

使用强类型语言还有多远?

假设我正在编写一个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)

但这总是矫枉过正吗?我喜欢自我记录,并保证它是它所说的,但它是否值得支付这样一个对象的构造和破坏,更不用说所有额外的打字?请让我知道您的意见和备选方案.

c++ api types strong-typing

42
推荐指数
6
解决办法
2357
查看次数

在C++中使用short(int16)进行饱和

我正在优化瓶颈代码:

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中有类似的东西吗?

c++ micro-optimization compiler-optimization

2
推荐指数
1
解决办法
448
查看次数

C++ 库中的任何内置钳位方法?

我想知道是否有一些内置的钳位方法可以钳制一个范围之间的值,比如在 (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)

c++ std clamp

-1
推荐指数
1
解决办法
1071
查看次数