1

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;}
}

ご覧のとおり、私のプロパティとコンストラクターは実装されていません。悩んでいる部分なので。

ご協力いただきありがとうございます。

4

3 に答える 3

4

基本的に、あなたはただ高いニブルと低いニブルが何であるかを覚えておく必要があります。低ニブルは、2進数の1111(10進数の15)でマスキングするだけで取得できます。高いニブルはbyte、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); }
}

しかし、私はあなたを助けることはできません:

public Nibble2(float x, float y)
{
    packedValue = 0;
}

これは64ビットであり、8に適合させたいためです。これらの値をどのように処理するかについて、より具体的にする必要があります。

于 2012-07-23T07:23:24.140 に答える
1

入力値と、このように入力されたバイト(10 進数00001111で 15) の AND を使用した場合。保存したい部分を保持します。次に、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); }
}
于 2012-07-23T07:10:49.287 に答える
1

次のバイト値を検討してください。

10101100 

バイトの上位ビットを読み取るには、バイトを右にシフトする必要があります。

10101100 (original)
01010110 (shifted one bit)
00101011  
00010101 
00001010 (shifted four bits)

を使用してバイトをシフトできますreturn (byte)(packedValue >> 4);

下位ビットのみを読み取るには、AND 演算を使用して上位ビットを削除するだけです。

10101100 
00001111 AND
--------
00001100

を使用して、値に対してこの AND 演算を実行できます。return (byte)(packedValue & 0xf);

これらの値の設定は、ターゲット ニブルをクリアしてから入力値を追加するだけで実行できます (上位ニブルを設定する場合は左にシフトします)。

packedValue = (byte)((packedValue & 0xf0) + (lowNibble & 0xf));
packedValue = (byte)((packedValue & 0xf) + (highNibble << 4));
于 2012-07-23T07:10:45.043 に答える