Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何获得两个(0~15)数字作为属性,一个字节作为支持字段?_C#_Properties_Byte - Fatal编程技术网

C# 如何获得两个(0~15)数字作为属性,一个字节作为支持字段?

C# 如何获得两个(0~15)数字作为属性,一个字节作为支持字段?,c#,properties,byte,C#,Properties,Byte,我正在制作一个基于瓷砖的2d平台,每个字节的内存都是宝贵的。我有一个字节字段,可以保存0到255之间的值,但我需要的是两个值为0到15的属性。如何将一个字节字段转换为两个这样的属性?您的意思是只使用较低的4位作为一个值,而使用较高的4位作为另一个值 要从1字节中获取两个值,请使用 a = byte & 15; b = byte / 16; 设置正好相反 byte = a | b * 16; 使用移位运算符更好,但现在编译器优化器通常会为您这样做 byte = a | (b <&

我正在制作一个基于瓷砖的2d平台,每个字节的内存都是宝贵的。我有一个字节字段,可以保存0到255之间的值,但我需要的是两个值为0到15的属性。如何将一个字节字段转换为两个这样的属性?

您的意思是只使用较低的4位作为一个值,而使用较高的4位作为另一个值

要从1字节中获取两个值,请使用

a = byte & 15;
b = byte / 16;
设置正好相反

byte = a | b * 16;
使用移位运算符更好,但现在编译器优化器通常会为您这样做

byte = a | (b << 4);

byte=a |(b你的意思是只使用低4位作为一个值,而使用高4位作为另一个值吗

要从1字节中获取两个值,请使用

a = byte & 15;
b = byte / 16;
设置正好相反

byte = a | b * 16;
使用移位运算符更好,但现在编译器优化器通常会为您这样做

byte = a | (b << 4);

byte=a |(b引用sradforth的答案,并回答您关于属性的问题:

private byte _myByte;
public byte LowerHalf
{
    get
    {
        return (byte)(_myByte & 15);
    }
    set
    {
        _myByte = (byte)(value | UpperHalf * 16);
    }
}
public byte UpperHalf
{
    get
    {
        return (byte)(_myByte / 16);
    }
    set
    {
        _myByte = (byte)(LowerHalf | value * 16);
    }
}

根据sradforth的回答回答,并回答您关于房产的问题:

private byte _myByte;
public byte LowerHalf
{
    get
    {
        return (byte)(_myByte & 15);
    }
    set
    {
        _myByte = (byte)(value | UpperHalf * 16);
    }
}
public byte UpperHalf
{
    get
    {
        return (byte)(_myByte / 16);
    }
    set
    {
        _myByte = (byte)(LowerHalf | value * 16);
    }
}

下面是一些属性和一些后备存储,我试图以一种使逻辑易于遵循的方式编写它们

private byte HiAndLo = 0;

private const byte LoMask = 15;  // 00001111
private const byte HiMask = 240; // 11110000

public byte Lo
{
    get
    {
       // ----&&&&
       return (byte)(this.hiAndLo & LoMask);
    }

    set
    {
       if (value > LoMask) // 
       {
           // Values over 15 are too high.
           throw new OverflowException();
       }

       // &&&&0000
       // 0000----
       // ||||||||
       this.hiAndLo = (byte)((this.hiAndLo & HiMask) | value);
    }
}

public byte Hi
{
    get
    {
        // &&&&XXXX >> 0000&&&&
        return (byte)((this.hiAndLo & HiMask) >> 4);
    }

    set
    {
        if (value > LoMask)
        {
            // Values over 15 are too high.
            throw new OverflowException();
        }

        // -------- << ----0000
        //             XXXX&&&&
        //             ||||||||
        this.hiAndLo = (byte)((hiAndLo & LoMask) | (value << 4 )); 
    }
}
专用字节HiAndLo=0;
私有常量字节LoMask=15;//00001111
私有常量字节HiMask=240;//11110000
公共字节Lo
{
得到
{
// ----&&&&
返回(字节)(this.hiAndLo&LoMask);
}
设置
{
如果(值>LoMask)//
{
//超过15的值太高。
抛出新的OverflowException();
}
// &&&&0000
// 0000----
// ||||||||
this.hiAndLo=(字节)((this.hiAndLo&HiMask)|值);
}
}
公共字节Hi
{
得到
{
//&&&&XXXX>>0000&&&&
返回(字节)((this.hiAndLo和HiMask)>>4);
}
设置
{
如果(值>LoMask)
{
//超过15的值太高。
抛出新的OverflowException();
}

//----------下面是一些属性和一些后备存储,我试图用一种使逻辑易于遵循的方式来编写它们

private byte HiAndLo = 0;

private const byte LoMask = 15;  // 00001111
private const byte HiMask = 240; // 11110000

public byte Lo
{
    get
    {
       // ----&&&&
       return (byte)(this.hiAndLo & LoMask);
    }

    set
    {
       if (value > LoMask) // 
       {
           // Values over 15 are too high.
           throw new OverflowException();
       }

       // &&&&0000
       // 0000----
       // ||||||||
       this.hiAndLo = (byte)((this.hiAndLo & HiMask) | value);
    }
}

public byte Hi
{
    get
    {
        // &&&&XXXX >> 0000&&&&
        return (byte)((this.hiAndLo & HiMask) >> 4);
    }

    set
    {
        if (value > LoMask)
        {
            // Values over 15 are too high.
            throw new OverflowException();
        }

        // -------- << ----0000
        //             XXXX&&&&
        //             ||||||||
        this.hiAndLo = (byte)((hiAndLo & LoMask) | (value << 4 )); 
    }
}
专用字节HiAndLo=0;
私有常量字节LoMask=15;//00001111
私有常量字节HiMask=240;//11110000
公共字节Lo
{
得到
{
// ----&&&&
返回(字节)(this.hiAndLo&LoMask);
}
设置
{
如果(值>LoMask)//
{
//超过15的值太高。
抛出新的OverflowException();
}
// &&&&0000
// 0000----
// ||||||||
this.hiAndLo=(字节)((this.hiAndLo&HiMask)|值);
}
}
公共字节Hi
{
得到
{
//&&&&XXXX>>0000&&&&
返回(字节)((this.hiAndLo和HiMask)>>4);
}
设置
{
如果(值>LoMask)
{
//超过15的值太高。
抛出新的OverflowException();
}

//-----是的,你试过什么?@Jodrell我试过读关于位运算的书,这让我很困惑:)我只是有点小吃(向任何得到这个的人道歉。)不幸的是,您必须多次阅读有关逐位运算的内容,并亲自尝试……如果没有它们,您无法将多个值打包为单字节/整数(请参阅@sradforth+1答案)。@Jodrell是“nibble”还是“nyble”?我见过它的两种拼写方式!是的,你试过什么?@Jodrell我试过阅读有关逐位运算的内容,这让我很困惑:)我只是有点小吃(向任何得到这个的人道歉。)不幸的是,您必须多次阅读有关逐位运算的内容,并亲自尝试……如果没有它们,您无法将多个值打包为单字节/整数(请参阅@sradforth+1答案)。@Jodrell是“nibble”还是“nyble”?我已经看到了它的两种拼写方式!谢谢!我对sradforth的答案没有任何理解,它对我来说仍然太模糊。谢谢!我对sradforth的答案没有任何理解,它对我来说仍然太模糊。@UserUserUser1306322我在代码中添加注释以帮助理解。@UserUserUser1306322我在代码中添加注释以帮助理解。