Jordan Savant # Software Engineer

Math Functions

Lerp

float bit::Math::lerp(float val1, float val2, float ratio)
{
    return val1 + ratio * (val2 - val1);
}

Clamp

float bit::Math::clamp(float value, float min, float max)
{
    return (value > max ? max : (value < min ? min : value));
}

Round

float bit::Math::round(float value)
{
    return std::floor(value + 0.5);
}

Floor Power of 2

float bit::Math::floorPowerOf2(float value)
{
    if(value > 1) // 32 bit twiddling
    {
        int v = (int)value;
        v |= v >> 1;
        v |= v >> 2;
        v |= v >> 4;
        v |= v >> 8;
        v |= v >> 16;
        return v - (v >> 1);
    }
    else
    {
        // domains: 0, .125, .25, .5, 1
        if(value == 0)
            return 0;
        if(value > 0 && value < .125)
            return 0;
        if(value >= .125 && value < .25)
            return .125;
        if(value >= .25 && value < .5)
            return .25;
        if(value >= .5 && value < 1)
            return .5;
        else
            return 1;
    }
}

Ceiling Power of 2

float bit::Math::ceilPowerOf2(float value)
{
    if(value > 1) // 32 bit twiddling
    {
        int v = (int)value;
        v--;
        v |= v >> 1;
        v |= v >> 2;
        v |= v >> 4;
        v |= v >> 8;
        v |= v >> 16;
        v++;
        return v;
    }
    else
    {
        // domains: 0, .125, .25, .5, 1
        if(value == 0)
            return 0;
        if(value > 0 && value <= .125)
            return .125;
        if(value > .125 && value <= .25)
            return .25;
        if(value > .25 && value <= .5)
            return .5;
        else
            return 1;
    }
}

Round to Power of 2

float bit::Math::roundPowerOf2(float value)
{
    float ceil = ceilPowerOf2(value);
    float floor = floorPowerOf2(value);
    if(std::abs(ceil - value) < std::abs(value - floor))
        return ceil;
    else
        return floor;
}

Bitwise Has Any

bool bit::Math::bitwiseHasAny(unsigned int value, unsigned int filter)
{
    return (value & filter) > 0;
}

Bitwise Has All

bool bit::Math::bitwiseHasAll(unsigned int value, unsigned int filter)
{
    return (value & filter) == filter;
}

Hash from String

unsigned int bit::Math::toHash(std::string const&st)
{
    // s[0]*31^(n - 1) + s[1]*31^(n - 2) + ... + s[n - 1]
    // where s[i] is the ith character of the string, n is the length of the string, and ^ indicates exponentiation
    unsigned int tally = 0;
    for(unsigned int i = 0; i < st.size(); i++)
    {
        unsigned int pos = i + 1;
        char s = st[i];
        double d = (double)s;
        tally += d * std::pow((double)31, (double)(pos - 1));
    }

    return tally;
}