二进制处理函数

unsigned const STAT_ZERO = 0x0008;
unsigned const STAT_ONE = 0x0002;
unsigned const STAT_TWO = 0x0004;
unsigned const STAT_THREE = 0x0008;

// 检测位有1位是1就返回true
template <class T, class U>
bool isAnyBitSet(T value, U mask)
{
    if ((value & mask) != 0)
        return true;
    else
        return false;
}
// 检测位所有位都为1才返回true
template <class T, class U>
bool areAllBitsSet(T value, U mask)
{
    if ((value & mask) == mask)
        return true;
    else
        return false;
}
// 检测位全为0返回false
template <class T, class U>
bool areAllBitsClear(T value, U mask)
{
    if ((value & mask) == 0)
        return true;
    else
        return false;
}
// 置位
template <class T, class U>
T setBits(T value, U mask)
{
    return (value | mask);
}
// 除了屏蔽位,其他全置位
template <class T, class U>
T setBitsExcept(T value, U mask)
{
    return (value | ~mask);
}
// 清除指定位
template <class T, class U>
T clearBits(T value, U mask)
{
    return (value & ~mask);
}
// 除了屏蔽位,其他全清0
template <class T, class U>
T clearBitsExcept(T value, U mask)
{
    return (value & mask);
}
// n指定位置
template <class T>
T setBitByPos(T value, unsigned char n)
{
    return (value | (1 << n));
}
template <class T>
T clearBitByPos(T value, unsigned char n)
{
    return (value & ~(1 << n));
}
// 先置位add指定位,再清remove指定位为0
template <class T, class U>
T setBitByPos(T value, U add, U remove)
{
    return ((value | add ) & ~remove);
}
template <class T>
bool isBitSetByPos(T value, unsigned char n)
{
    if ((value & (1 << n)) != 0)
        return true;
    else
        return false;
}

template <class T>
bool isBitClearByPos(T value, unsigned char n)
{
    if ((value & (1 << n)) == 0)
        return true;
    else
        return false;
}
// 获取二进制1个数
template <class T>
long getOneNum(T value)
{
    int loop = sizeof(T)*8;
    if (loop > sizeof(long)*8)
    {
        printf("value's bitwidth cannot longer than one word");
        return 0;
    }
    int n=0;
    int num = 0;
    while (loop--)
    {
        if (isBitSetByPos(value, n++))
            num++;
    }
    return num;
}
// 获取二进制0个数
template <class T>
long getZeroNum(T value)
{
    int loop = sizeof(T)*8;
    if (loop > sizeof(long)*8)
    {
        printf("value's bitwidth cannot longer than one word");
        return 0;
    }
    int n=0;
    int num = 0;
    while (loop--)
    {
        if (isBitClearByPos(value, n++))
            num++;
    }
    return num;
}

在处理二进制数据时,Power Query M函数提供了多种二进制操作函数,用于数据的编码和解码。这些函数是数据处理过程中的重要组成部分,尤其是在处理网络传输数据或文件数据时显得尤为重要。下面将介绍几个常用的二进制处理函数,并结合实际使用场景提供示例。 参考资源链接:[Power Query M函数中文详解与在线教程](https://wenku.youkuaiyun.com/doc/6o7f5zwp57?spm=1055.2569.3001.10343) 首先,我们有***PRESS和BINARY.DECOMPRESS函数,它们用于对二进制数据进行压缩和解压缩。压缩可以减少数据传输的大小,提高效率。例如,在将数据存储到Azure Storage之前,我们可以使用***PRESS进行压缩,以减少存储成本和提升读取性能。 其次,BINARYENCODING系列函数,如BINARYENCODING.BASE64和BINARYENCODING.HEX,用于将二进制数据编码为Base64或十六进制格式,以便于数据在不支持二进制类型的系统间传输。例如,当需要通过HTTP请求发送二进制数据时,可以先将二进制数据转换为Base64编码,然后再进行发送。 再来,BINARY.TOLIST和BINARY.TOTEXT函数能够将二进制数据转换为列表或文本,这在需要对二进制数据进行逐项操作或展示时非常有用。在数据分析报告中,如果需要展示二进制数据的原始形式,可以使用BINARY.TOTEXT进行转换。 最后,了解如何使用BINARYFORMAT系列函数来处理特定格式的二进制数据也是必要的。例如,BINARYFORMAT.BYTEORDER用于指定字节序,这对于二进制文件的解析至关重要。不同的系统可能使用不同的字节序,因此在处理来自不同源的二进制数据时,正确设置字节序是保证数据正确解析的关键。 以上提到的二进制处理函数的使用场景和示例,都可以在《Power Query M函数中文详解与在线教程》中找到更详细的解释和演示。这份资源提供了这些函数的详细说明和具体操作,帮助用户在实际项目中灵活运用,提高数据处理能力。 参考资源链接:[Power Query M函数中文详解与在线教程](https://wenku.youkuaiyun.com/doc/6o7f5zwp57?spm=1055.2569.3001.10343)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值