C#实现类似C/C++的位域

#region 位(BIT)类型自定义
[StructLayout(LayoutKind.Explicit, Size = 1)]
public struct IO_BIT_BYTE
{
    [FieldOffset(0)]
    byte _bit0;
    [FieldOffset(0)]
    byte _bit1;
    [FieldOffset(0)]
    byte _bit2;
    [FieldOffset(0)]
    byte _bit3;
    [FieldOffset(0)]
    byte _bit4;
    [FieldOffset(0)]
    byte _bit5;
    [FieldOffset(0)]
    byte _bit6;
    [FieldOffset(0)]
    byte _bit7;
    [FieldOffset(0)]
    public byte Value;

    #region 属性
    public bool Bit0
    {
        set
        {
            if (value)
            {
                _bit0 |= (byte)0x01;
            }
            else
            {
                _bit0 &= (byte)0xFE;
            }
        }
        get
        {
            bool result = false;
            byte t = (byte)(_bit0 << 7);
            result = (byte)(t & 0x80) == (byte)0x80 ? true : false;
            return result;
        }
    }

    public bool Bit1
    {
        set
        {
            if (value)
            {
                _bit1 |= (byte)0x02;
            }
            else
            {
                _bit1 &= (byte)0xFD;
            }
        }
        get
        {
            byte t = (byte)(_bit1 << 6);
            bool result = (byte)(t & 0x80) == (byte)0x80 ? true : false;
            return result;
        }
    }

    public bool Bit2
    {
        set
        {
            if (value)
            { _bit2 |= (byte)0x04; }
            else
            { _bit2 &= (byte)0xFB; }

        }
        get
        {
            byte t = (byte)(_bit2 << 5);
            bool result = (byte)(t & 0x80) == (byte)0x80 ? true : false;
            return result;
        }
    }

    public bool Bit3
    {
        set
        {
            if (value)
            { _bit3 |= (byte)0x08; }
            else
            { _bit3 &= (byte)0xF7; }
        }
        get
        {
            byte t = (byte)(_bit3 << 4);
            bool result = (byte)(t & 0x80) == (byte)0x80 ? true : false;
            return result;
        }
    }

    public bool Bit4
    {
        set
        {
            if (value)
            { _bit4 |= (byte)0x10; }
            else
            { _bit4 &= (byte)0xEF; }
        }
        get
        {
            byte t = (byte)(_bit4 << 3);
            bool result = (byte)(t & 0x80) == (byte)0x80 ? true : false;
            return result;
        }
    }

    public bool Bit5
    {
        set
        {
            if (value)
            { _bit5 |= (byte)0x20; }
            else
            { _bit5 &= (byte)0xDF; }
        }
        get
        {
            byte t = (byte)(_bit5 << 2);
            bool result = (byte)(t & 0x80) == (byte)0x80 ? true : false;
            return result;
        }
    }

    public bool Bit6
    {
        set
        {
            if (value)
            { _bit6 |= (byte)0x40; }
            else
            { _bit6 &= (byte)0xBF; }
        }
        get
        {
            byte t = (byte)(_bit6 << 1);
            bool result = (byte)(t & 0x80) == (byte)0x80 ? true : false;
            return result;
        }
    }

    public bool Bit7
    {
        set
        {
            if (value)
            { _bit7 |= (byte)0x80; }
            else
            { _bit7 &= (byte)0x7F; }
        }
        get
        {
            bool result = (byte)(_bit7 & 0x80) == (byte)0x80 ? true : false;
            return result;
        }
    }

    public bool this[int idx]
    {
        set
        {
            switch (idx)
            {
            case 0:
                Bit0 = value;
                break;
            case 1:
                Bit1 = value;
                break;
            case 2:
                Bit2 = value;
                break;
            case 3:
                Bit3 = value;
                break;
            case 4:
                Bit4 = value;
                break;
            case 5:
                Bit5 = value;
                break;
            case 6:
                Bit6 = value;
                break;
            case 7:
                Bit7 = value;
                break;
            default:
                throw new IndexOutOfRangeException();
            }
        }
        get
        {
            switch (idx)
            {
            case 0:
                return Bit0;
            case 1:
                return Bit1;
            case 2:
                return Bit2;
            case 3:
                return Bit3;
            case 4:
                return Bit4;
            case 5:
                return Bit5;
            case 6:
                return Bit6;
            case 7:
                return Bit7;
            default:
                throw new IndexOutOfRangeException();
            }
        }

    }
    #endregion 属性

    #region 重载

    public static IO_BIT_BYTE operator & (IO_BIT_BYTE value1, byte value2)
    {
        IO_BIT_BYTE result = new IO_BIT_BYTE();
        result.Value = (byte)(value1.Value & value2);
        return result;
    }
    public static IO_BIT_BYTE operator | (IO_BIT_BYTE value1, byte value2)
    {
        IO_BIT_BYTE result = new IO_BIT_BYTE();
        result.Value = (byte)(value1.Value | value2);
        return result;
    }

    public static IO_BIT_BYTE operator >> (IO_BIT_BYTE value, int num)
    {
        IO_BIT_BYTE result = new IO_BIT_BYTE();
        result.Value = (byte)(value.Value >> num);
        return result;
    }

    public static IO_BIT_BYTE operator << (IO_BIT_BYTE value, int num)
    {
        IO_BIT_BYTE result = new IO_BIT_BYTE();
        result.Value = (byte)(value.Value << num);
        return result;
    }
    public static bool operator == (IO_BIT_BYTE value1, IO_BIT_BYTE value2)
    {
        if (value1.Value == value2.Value) return true;
        return false;
    }

    public static bool operator != (IO_BIT_BYTE value1, IO_BIT_BYTE value2)
    {
        if (value1.Value == value2.Value) return false;
        return true;
    }

    /// <summary>
    /// 显示二进制值
    /// </summary>
    /// <returns></returns>
    public override string ToString()
    {
        StringBuilder sb = new StringBuilder();
        for (int i = 7; i >= 0; i--)
        {
            if (this[i]) sb.Append("1"); else sb.Append("0");
        }
        return sb.ToString();
    }
    #endregion 重载
}
#endregion 位(BIT)类型自定义

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
C语言中的共用体(Union)和位(Bit-Field)是用来优化内存使用和灵活操作数据的工具。 共用体是一种特殊的数据类型,它允许不同的变量共享同一块内存空间。共用体中的成员变量共享同一内存,占用内存大小等于最大成员的大小。通过修改共用体的一个成员变量的值,可以影响到其他成员变量的值。共用体适用于在不同的数据类型之间进行转换或者存储占用内存大小不定的数据。 位是一种特殊的结构体成员变量,可以指定成员变量占用的位数,从而实现对内存空间的灵活利用。位的成员变量必须是整型数据类型,并且位的大小不能超过该整型类型的大小。位可以用于减小数据结构占用的内存大小,以及进行数据的位操作。 共用体和位结构体可以一起使用。通过在位结构体中定义共用体成员变量,可以实现对内存的灵活使用和数据的高效操作。共用体可以用于存储不同类型的数据,而位可以用于压缩数据的存储空间。这种结合使用的方式可以为我们的程序带来更加高效和节省内存的特点。 总结起来,C语言中的共用体和位结构体提供了一种优化内存使用和操作数据的方式。它们可以灵活地对内存空间进行利用,并且能够高效地操作数据。通过合理的使用共用体和位结构体,我们可以达到节省内存和提高程序执行效率的目的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值