ビットに対するC / C ++関数の動作を行います

:言葉の前に書かれた
卒業生からの著者は、多くのゲームや研究・交流へのすべてのための実用的なケースモジュールのコードを、ゲーム開発に携わってきました、知識が質問があれば、グループを追加してください641 792 143交流や学習、いくつかの助けを持って来ることを願って

#define MAKEINT16(a, b)  ((uint16_t)(((uint8_t)((uint16_t)(a) & 0xff)) | ((uint16_t)((uint8_t)((uint16_t)(b) & 0xff))) << 8))
#define MAKEINT32(a, b)  ((uint32_t)(((uint16_t)((uint32_t)(a) & 0xffff)) | ((uint32_t)((uint16_t)((uint32_t)(b) & 0xffff))) << 16))

// 判断数字的某位是否为1,idx从0~31
bool bitOPMask(int val, int idx)
{
    if (idx < 0 || idx >= 32)
    {
        return false;
    }

    val = (val >> idx) & 0x01;

    return val == 1;
}

// 取反
int bitOpNot(int val)
{
    return ~val;
}

// 位与
int bitOpAnd(int val1, int val2)
{
    return val1 & val2;
}

//位或
int bitOpOr(int val1, int val2)
{
    return val1 | val2;
}

// 位右移
int bitOpRig(int val, int cnt)
{
    return val >> cnt;
}

// 位左移
int bitOpLeft(int val, int cnt)
{
    return val << cnt;
}

// 把数字对应的位变成1
int bitOpSetMask(int val, int idx, bool flag)
{
    if (idx < 0 || idx >= 32)
    {
        return val;
    }

    unsigned int mask = (1 << idx);

    if (flag)
    {
        val |= mask;
    }
    else
    {
        // 变成0
        mask = ~mask;
        val &= mask;
    }

    return val;
}


/*
* Comments: 把32位整形数第nBitPos位置nNum (bBit为true时置1,否则置0)
* Param unsigned int nValue: 32位整形数
* Param unsigned int nBitPos: 置位位数
* Param bool bBit: 置位数
* @Return int:  成功则 返回置位后的整形数,否则返回-1
*/
int setIntBit(unsigned int nValue, unsigned int nBitPos, bool bBit)
{
    if (nBitPos >= (32)) return -1;

    unsigned int newValue;

    if (bBit)
    {
        newValue = (unsigned int)(0x1 << nBitPos);
        nValue |= newValue;
    }
    else
    {
        newValue = (unsigned int)(~(0x1 << nBitPos));
        nValue &= newValue;
    }

    return nValue;
}


/*
* Comments: 判断32位整形数nBitPos位是为0/1
* Param unsigned int nValue: 整形数
* Param unsigned int nBitPos: 位数
* @Return int:
*/
int getIntBit(unsigned int nValue, unsigned int nBitPos)
{
    if (nBitPos >= (32)) return -1;

    return (nValue & (0x1 << nBitPos)) ? true : false;
}

//获取该值中一个有多少个1 或0 flag = true 计算1的数量
int getIntBitCount(unsigned int nValue,bool flag = true)
{
    int count = 0;

    for (unsigned int i = 0; i < 32; i++)
    {
        if ((1 << i)&nValue)
        {
            count += 1;
        }
    }

    return flag ? count:(32-count);
}

// 根据4个字节的数字合并成一个int32,b1到b4分别是低位-高位,注意每个数字不能超过256
int int32Byte(int b1, int b2, int b3, int b4)
{
    return MAKEINT32(MAKEINT16(b1, b2), MAKEINT16(b3, b4));
}

公開された43元の記事 ウォンの賞賛1 ビュー2319

おすすめ

転載: blog.csdn.net/lpl312905509/article/details/102624792