解决MySql布尔型新旧版本兼容问题,采用枚举来表示布尔型的数据表。由正向工程赋值
大石头 authored at 2018-05-15 21:21:05
3.08 KiB
X
namespace NewLife;

/// <summary>数据位助手</summary>
public static class BitHelper
{
    /// <summary>设置数据位</summary>
    /// <param name="value">数值</param>
    /// <param name="position"></param>
    /// <param name="flag"></param>
    /// <returns></returns>
    public static UInt16 SetBit(this UInt16 value, Int32 position, Boolean flag)
    {
        return SetBits(value, position, 1, (flag ? (Byte)1 : (Byte)0));
    }

    /// <summary>设置数据位</summary>
    /// <param name="value">数值</param>
    /// <param name="position"></param>
    /// <param name="length"></param>
    /// <param name="bits"></param>
    /// <returns></returns>
    public static UInt16 SetBits(this UInt16 value, Int32 position, Int32 length, UInt16 bits)
    {
        if (length <= 0 || position < 0 || position >= 16) return value;
        // 防止 position+length 超过 16 位时掩码移位溢出,截断到合法范围
        if (position + length > 16) length = 16 - position;

        var mask = (2 << (length - 1)) - 1;

        value &= (UInt16)~(mask << position);
        value |= (UInt16)((bits & mask) << position);

        return value;
    }

    /// <summary>设置数据位</summary>
    /// <param name="value">数值</param>
    /// <param name="position"></param>
    /// <param name="flag"></param>
    /// <returns></returns>
    public static Byte SetBit(this Byte value, Int32 position, Boolean flag)
    {
        // 负位置移位会产生不可预期结果(如 -1 被掩码为 31),必须拦截
        if (position < 0 || position >= 8) return value;

        var mask = (2 << (1 - 1)) - 1;

        value &= (Byte)~(mask << position);
        value |= (Byte)(((flag ? 1 : 0) & mask) << position);

        return value;
    }

    /// <summary>获取数据位</summary>
    /// <param name="value">数值</param>
    /// <param name="position"></param>
    /// <returns></returns>
    public static Boolean GetBit(this UInt16 value, Int32 position)
    {
        return GetBits(value, position, 1) == 1;
    }

    /// <summary>获取数据位</summary>
    /// <param name="value">数值</param>
    /// <param name="position"></param>
    /// <param name="length"></param>
    /// <returns></returns>
    public static UInt16 GetBits(this UInt16 value, Int32 position, Int32 length)
    {
        if (length <= 0 || position < 0 || position >= 16) return 0;
        // 防止 position+length 超过 16 位时掩码溢出,截断到合法范围
        if (position + length > 16) length = 16 - position;

        var mask = (2 << (length - 1)) - 1;

        return (UInt16)((value >> position) & mask);
    }

    /// <summary>获取数据位</summary>
    /// <param name="value">数值</param>
    /// <param name="position"></param>
    /// <returns></returns>
    public static Boolean GetBit(this Byte value, Int32 position)
    {
        if (position < 0 || position >= 8) return false;

        var mask = (2 << (1 - 1)) - 1;

        return ((Byte)((value >> position) & mask)) == 1;
    }
}