Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.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# 在C中使用半字节_C#_Java_Javascript_.net_Xna - Fatal编程技术网

C# 在C中使用半字节

C# 在C中使用半字节,c#,java,javascript,.net,xna,C#,Java,Javascript,.net,Xna,嘿,我想写一个结构,比如XNA Color结构或SurfaceFormat.Bgra4444结构,它在一个8位字节中包含2个半字节 这就是我目前所拥有的 /// <summary> /// Packed byte containing two 4bit values /// </summary> public struct Nibble2 : IEquatable<Nibble2> { private byte packedValue; pu

嘿,我想写一个结构,比如XNA Color结构或SurfaceFormat.Bgra4444结构,它在一个8位字节中包含2个半字节

这就是我目前所拥有的

/// <summary>
/// Packed byte containing two 4bit values
/// </summary>
public struct Nibble2 : IEquatable<Nibble2>
{
    private byte packedValue;

    public byte X
    {
        get { return 0; }
        set { }
    }

    public byte Y
    {
        get { return 0; }
        set { }
    }

    /// <summary>
    /// Creates an instance of this object.
    /// </summary>
    /// <param name="x">Initial value for the x component.</param>
    /// <param name="y">Initial value for the y component.</param>
    public Nibble2(float x, float y)
    {
        packedValue = 0;
    }

    /// <summary>
    /// Creates an instance of this object.
    /// </summary>
    /// <param name="vector">Input value for both components.</param>
    public Nibble2(Vector2 vector)
    {
        packedValue = 0;
    }

    public static bool operator ==(Nibble2 a, Nibble2 b) { return a.packedValue == b.packedValue; }
    public static bool operator !=(Nibble2 a, Nibble2 b) { return a.packedValue != b.packedValue; }

    public override string ToString()
    { return packedValue.ToString("X : " + X + " Y : " + Y, CultureInfo.InvariantCulture); }

    public override int GetHashCode()
    {return packedValue;}

    public override bool Equals(object obj)
    {
        if (obj is Nibble2)
            return Equals((Nibble2)obj);
        return false;
    }

    public bool Equals(Nibble2 other)
    {return packedValue == other.packedValue;}
}
正如您所看到的,我的属性和构造函数没有实现。因为这是我遇到麻烦的部分


感谢您提供的帮助。

请考虑以下字节值:

10101100 
要读取字节的高位,应将字节右移:

10101100 (original)
01010110 (shifted one bit)
00101011  
00010101 
00001010 (shifted four bits)
您可以使用return bytepackedValue>>4来移动字节

要仅读取低位,只需使用AND运算消除高位:

10101100 
00001111 AND
--------
00001100
您可以使用return bytepackedValue&0xf;对值执行此AND操作

设置这些值可以通过清除目标半字节,然后简单地添加左移的输入值(如果设置高半字节):

packedValue = (byte)((packedValue & 0xf0) + (lowNibble & 0xf));
packedValue = (byte)((packedValue & 0xf) + (highNibble << 4));

考虑以下字节值:

10101100 
要读取字节的高位,应将字节右移:

10101100 (original)
01010110 (shifted one bit)
00101011  
00010101 
00001010 (shifted four bits)
您可以使用return bytepackedValue>>4来移动字节

要仅读取低位,只需使用AND运算消除高位:

10101100 
00001111 AND
--------
00001100
您可以使用return bytepackedValue&0xf;对值执行此AND操作

设置这些值可以通过清除目标半字节,然后简单地添加左移的输入值(如果设置高半字节):

packedValue = (byte)((packedValue & 0xf0) + (lowNibble & 0xf));
packedValue = (byte)((packedValue & 0xf) + (highNibble << 4));

如果你把输入值和字节填充成这样,00001111是12月的15,你就保留了你想要保存的部分。然后,必须将Nibble2的左半部分左移4个字节,以存储在packedValue字节中

private byte x = 0;
private byte y = 0;


public byte X
{
    get { return x; }
    set { x = value}
}

public byte Y
{
    get { return y; }
    set { y = value }
}

private byte packedValue 
{
    get { return (x & 15 << 4) | (y & 15); }
}

如果你把输入值和字节填充成这样,00001111是12月的15,你就保留了你想要保存的部分。然后,必须将Nibble2的左半部分左移4个字节,以存储在packedValue字节中

private byte x = 0;
private byte y = 0;


public byte X
{
    get { return x; }
    set { x = value}
}

public byte Y
{
    get { return y; }
    set { y = value }
}

private byte packedValue 
{
    get { return (x & 15 << 4) | (y & 15); }
}

基本上,你只需要记住什么是高小口和低小口。只需使用二进制1111十进制15进行掩蔽,即可获得低半字节。由于字节右移4无符号,所以可以获得高半字节。剩下的只是一点数学知识

// assume x is the low nibble
public byte X
{
    get { return (byte)(packedValue & 15); }
    set { packedValue = (packedValue & 240) | (value & 15); }
}

// assume y is the high nibble
public byte Y
{
    get { return (byte) (packedValue >> 4); }
    set { packedValue = (value << 4) | (packedValue & 15); }
}

因为这是64位,你想把它放进8位。您需要更具体地说明如何处理这些值。

基本上,您只需要记住什么是高半字节和低半字节。只需使用二进制1111十进制15进行掩蔽,即可获得低半字节。由于字节右移4无符号,所以可以获得高半字节。剩下的只是一点数学知识

// assume x is the low nibble
public byte X
{
    get { return (byte)(packedValue & 15); }
    set { packedValue = (packedValue & 240) | (value & 15); }
}

// assume y is the high nibble
public byte Y
{
    get { return (byte) (packedValue >> 4); }
    set { packedValue = (value << 4) | (packedValue & 15); }
}

因为这是64位,你想把它放进8位。您需要更具体地说明如何处理这些值。

您可能希望在编辑后保留原始值的另一半+=对于位运算来说是个坏主意;坦白地说,我坚持使用packedValue+=value&15抱歉@marcGravel我并没有真正理解你:。我不羞于这么说呵呵,没问题;好啊对于+=问题,设置X=4,现在设置X=5,现在设置X=4。什么是X?对于保存旧价值问题;设置X=4,Y=5;现在什么是X?我希望能够分别设置X或Y,而不会丢失其中的数据。还有,我如何为get assessors屏蔽数据以重新获取数据?您可能希望在编辑后保留原始值的另一半+=对于位运算来说是一个坏主意;坦白地说,我坚持使用packedValue+=value&15抱歉@marcGravel我并没有真正理解你:。我不羞于这么说呵呵,没问题;好啊对于+=问题,设置X=4,现在设置X=5,现在设置X=4。什么是X?对于保存旧价值问题;设置X=4,Y=5;现在什么是X?我希望能够分别设置X或Y,而不会丢失其中的数据。另外,我如何为get assessors屏蔽数据以重新获取数据?我希望该函数只接收从0到15的2个字节,但我可以使用属性设置值。谢谢你的帮助!标记为答案。我希望该函数只接收从0到15的2个字节,但我可以使用属性设置值。谢谢你的帮助!标记为答案。