位字段在C#结构中表现不正常

位字段在C#结构中表现不正常,c#,structure,C#,Structure,最小:6位 res1:1位 iv:1位 结构中的所有内容看起来都很棒,但我没有得到预期的结果 struct cp56time2a { internal byte cp56time2a_data1; public byte min { get { return (byte)(cp56time2a_data1 & 0x3f); } set { cp56time2a_data1 = (byte)((cp56time2a_d

最小:6位 res1:1位 iv:1位

结构中的所有内容看起来都很棒,但我没有得到预期的结果

    struct cp56time2a
{

    internal byte cp56time2a_data1; 


    public byte min
    {
        get { return (byte)(cp56time2a_data1 & 0x3f); }
        set { cp56time2a_data1 = (byte)((cp56time2a_data1 & ~0x3f) | (value & 0x3f)); }
    }                                           //min :6;   0..59 
    public byte res1
    {
        get        { return (byte)((cp56time2a_data1 >> 6) & 0x01); }
        set        { cp56time2a_data1 = (byte)((cp56time2a_data1 & ~(0x01 << 6)) | (value & 0x01) << 6); }
    }
    public byte iv
    {
        get        { return (byte)((cp56time2a_data1 >> 7) & 0x01); }
        set        { cp56time2a_data1 = (byte)((cp56time2a_data1 & ~(0x01 << 7)) | (value & 0x01) << 7); }
    }         
}     
预计将显示:
min=21 | | res1=1 | | iv=0

但我得到的是:


结构的内部字节行为不正常。请说出你的想法

对于两个属性
res1
iv
,您有:
值&0x01
,换句话说,您只获取分配给这些属性的值的最低有效位


当您读取这些属性时,也会执行以下操作:
&0x01
。所以很明显,这些属性是用来读写一位的,也就是说,它们是
0
1

res1
iv
设为
byte
而不是
bool
有什么意义?只能表示
1
0
。将
0x55
赋值给它们会产生误导。所有结果都是正确的。没有什么行为不端。你能解释一下为什么你认为他们错了吗?为什么您希望它在分配给res1之前显示res1=1?你从不给它赋值,所以它保持为零!当你给它赋值时(低位0x55),它会变为1。@Rotem我有很多字节要从缓冲区读取,我不想在函数内部做掩码和移位。此外,我有类似的结构,由几个1 | 2 | 3 | 4 | 5位序列组成:所以我没有使事情复杂化……你说得对。谢谢你,伙计。res1:'value&0x40'iv:'value&0x80'。这应该可以解决它。
        T.min = 0x55 ;     
        Console.WriteLine("min = {0}", T.min);
        Console.WriteLine("res1 = {0}", T.res1);
        Console.WriteLine("iv = {0}", T.iv);
        Console.WriteLine("cp56time2a_data1 = {0}",T.cp56time2a_data1);

        T.res1 = 0x55 ;
        Console.WriteLine("min = {0}", T.min);
        Console.WriteLine("res1 = {0}", T.res1);
        Console.WriteLine("iv = {0}", T.iv);
        Console.WriteLine("cp56time2a_data1 = {0}", T.cp56time2a_data1);

        T.iv = 0x55 ;
        Console.WriteLine("min = {0}", T.min);
        Console.WriteLine("res1 = {0}", T.res1);
        Console.WriteLine("iv = {0}", T.iv);
        Console.WriteLine("cp56time2a_data1 = {0}", T.cp56time2a_data1);`