美文网首页
暴雪中关于按位与取反和或的应用

暴雪中关于按位与取反和或的应用

作者: 人气小哥 | 来源:发表于2022-05-10 13:55 被阅读0次

lua版本

--按位与取反
--tbTeTile[layer]["Block"] &= ~(TB_BASE_TEX_INDEX[k])
function g_bitAndNot(a, b)
    return bit._and(a, bit._not(b))
end

--按位或
--tbTeTile[layer]["Block"] |= TB_BASE_TEX_INDEX[k]
function g_bitOr(a, b)
    return bit._or(a, b)
end

WOW服务器C++版本中的

//关于与取反的设置 技能相关 暴雪很多运算都与此相关
void Object::SetFlag(uint16 index, uint32 newFlag)
{
    ASSERT(index < m_valuesCount || PrintIndexError(index, true));
    uint32 oldval = m_uint32Values[index];
    uint32 newval = oldval | newFlag;

    if (oldval != newval)
    {
        m_uint32Values[index] = newval;
        _changesMask.SetBit(index);

        AddToObjectUpdateIfNeeded();
    }
}

void Object::RemoveFlag(uint16 index, uint32 oldFlag)
{
    ASSERT(index < m_valuesCount || PrintIndexError(index, true));
    ASSERT(m_uint32Values);

    uint32 oldval = m_uint32Values[index];
    uint32 newval = oldval & ~oldFlag;

    if (oldval != newval)
    {
        m_uint32Values[index] = newval;
        _changesMask.SetBit(index);

        AddToObjectUpdateIfNeeded();
    }
}

void Object::ToggleFlag(uint16 index, uint32 flag)
{
    if (HasFlag(index, flag))
    {
        RemoveFlag(index, flag);
    }
    else
    {
        SetFlag(index, flag);
    }
}

[[nodiscard]] bool Object::HasFlag(uint16 index, uint32 flag) const
{
    if (index >= m_valuesCount && !PrintIndexError(index, false))
    {
        return false;
    }

    return (m_uint32Values[index] & flag) != 0;
}

void Object::ApplyModFlag(uint16 index, uint32 flag, bool apply)
{
    if (apply)
    {
        SetFlag(index, flag);
    }
    else
    {
        RemoveFlag(index, flag);
    }
}

void Object::SetByteFlag(uint16 index, uint8 offset, uint8 newFlag)
{
    ASSERT(index < m_valuesCount || PrintIndexError(index, true));

    if (offset > 3)
    {
        LOG_ERROR("entities.object", "Object::SetByteFlag: wrong offset {}", offset);
        return;
    }

    if (!(uint8(m_uint32Values[index] >> (offset * 8)) & newFlag))
    {
        m_uint32Values[index] |= uint32(uint32(newFlag) << (offset * 8));
        _changesMask.SetBit(index);

        AddToObjectUpdateIfNeeded();
    }
}

void Object::RemoveByteFlag(uint16 index, uint8 offset, uint8 oldFlag)
{
    ASSERT(index < m_valuesCount || PrintIndexError(index, true));

    if (offset > 3)
    {
        LOG_ERROR("entities.object", "Object::RemoveByteFlag: wrong offset {}", offset);
        return;
    }

    if (uint8(m_uint32Values[index] >> (offset * 8)) & oldFlag)
    {
        m_uint32Values[index] &= ~uint32(uint32(oldFlag) << (offset * 8));
        _changesMask.SetBit(index);

        AddToObjectUpdateIfNeeded();
    }
}

[[nodiscard]] bool Object::HasByteFlag(uint16 index, uint8 offset, uint8 flag) const
{
    ASSERT(index < m_valuesCount || PrintIndexError(index, false));
    ASSERT(offset < 4);
    return (((uint8*) &m_uint32Values[index])[offset] & flag) != 0;
}

void Object::SetFlag64(uint16 index, uint64 newFlag)
{
    uint64 oldval = GetUInt64Value(index);
    uint64 newval = oldval | newFlag;
    SetUInt64Value(index, newval);
}

void Object::RemoveFlag64(uint16 index, uint64 oldFlag)
{
    uint64 oldval = GetUInt64Value(index);
    uint64 newval = oldval & ~oldFlag;
    SetUInt64Value(index, newval);
}

void Object::ToggleFlag64(uint16 index, uint64 flag)
{
    if (HasFlag64(index, flag))
    {
        RemoveFlag64(index, flag);
    }
    else
    {
        SetFlag64(index, flag);
    }
}

[[nodiscard]] bool Object::HasFlag64(uint16 index, uint64 flag) const
{
    ASSERT(index < m_valuesCount || PrintIndexError(index, false));
    return (GetUInt64Value(index) & flag) != 0;
}

void Object::ApplyModFlag64(uint16 index, uint64 flag, bool apply)
{
    if (apply)
    {
        SetFlag64(index, flag);
    }
    else
    {
        RemoveFlag64(index, flag);
    }
}

相关文章

  • 暴雪中关于按位与取反和或的应用

    lua版本 WOW服务器C++版本中的

  • js 中位运算的应用

    按位运算符有6个: 按位与 & 按位或 | 按位异或 ^ 取反 ~ 右移 >> 左移 << 应用...

  • ios 中的位运算

    位运算的符号:~ | & ^ << >>分别代表的是按位取反,按位或,按位与,按位异或,左移,右移 按位取反操作 ...

  • C、数据结构知识点

    1. 位运算符有: &(按位与)、|(按位或)、^(按位异或)、~ (按位取反)。 其中,按位取反运算符是单目运算...

  • 位运算:包括按位与(&)、按位或(|)、异或(^)、按位取反(~)以及移位(<<,>>)。“与”同为‘1’为‘...

  • 位运算

    名称符号 按位与 & 按位或 | 按位异或 ^ 按位取反 ~ 左移运算 << 右移运算 >> &按位与的用法(相同...

  • ~ 按位取反<< 左移 右移<<= 左移并赋值= 右移并赋值& 按位与^ 按位异或| 按位或&= 按位与赋值^...

  • Java中的位运算符

    按位与(&)、按位或(|)、异或(^)取反(~)、左移(<<)、右移(>>) 按位与(&) 例如:3&5 即 0...

  • &:按位与、|:按位或、^:按位异或、~:按位取反

    主要针对于整数运算(转换成二进制)。 &:按位与:对应位都是1 则返回 1;只要有一个不是1 则返回 0;|:按位...

  • 位运算(了解)

    本篇文章仅作为了解 位运算 & 按位与 | 按位或 ^ 按位异或 ~ 取反 << 左移 >> 右移 按位与 & 一...

网友评论

      本文标题:暴雪中关于按位与取反和或的应用

      本文链接:https://www.haomeiwen.com/subject/keulurtx.html