C/C++实现位操作函数

写到前面的话:
作者从毕业开始一直从事游戏开发,提供大量游戏实战模块代码及案例供大家学习与交流,希望以下知识可以带来一些帮助,如有任何疑问,请加群641792143交流与学习

#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));
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值