将 4x 0-16 数字存储在一个短字符中(或一个字节中存储 2 个数字)

Storing 4x 0-16 numbers in a short (or 2 numbers in a byte)

我正在将一些二进制数据打包成一个 short,但想要 0-F 的 4x 值。并且希望在没有一堆 switch() 案例读取 string.split 的情况下做到这一点十六进制

有人对此有一个聪明、优雅的解决方案,还是我应该直接使用它?

例如; 1C4A = (1, 12, 4, 10)

您可以移动 4(或除以 16 并乘以 16)以将数字移动到不同的位值。然后屏蔽并移动您的打包号码以取回您的原始号码。

例如,如果您想存储 1 和 2,您可以这样做:

int packed = (1 << 4) + 2;
int v1 = (packed & 0xF0) >> 4;
int v2 = packed & 0x0F;

Console.WriteLine($"{v1}, {v2}");
>>> 1, 2

进出班

var a = 1;
var b = 12;
var c = 4;
var d = 10;

// in
var packed = (short) ((a << 12) | (b << 8) | (c << 4) | d);

// out
a = (packed >> 12) & 0xf;
b = (packed >> 8) & 0xf;
c = (packed >> 4) & 0xf;
d = packed & 0xF;

Console.WriteLine(a);
Console.WriteLine(b);
Console.WriteLine(c);
Console.WriteLine(d);

输出

1
12
4
10