【发布时间】:2018-09-08 13:26:42
【问题描述】:
我正在尝试在 C# 中将以下数字编码为单个 64 位长:
- 最多 2048(年)=> 12 位
- 最多 16(月)=> 6 位
- 最多 32(天)=> 7 位
- 最多 32(小时)=> 7 位
- 总共 63 位的其他值(包括以前的值)
结果数字的结构应该包含具有固定位大小的编码值,以便我可以轻松地对其进行解码(例如,通过从数字的第 13 位开始取 6 位来解码月份,因为前 12 位是为年份保留的)。
到目前为止,我并没有经常使用按位运算,所以我有点挣扎,我想出了以下代码来做到这一点:
private static long AddBitwise(long to, int toAdd, int startPosition, int maxLengthInBits)
{
var filledNumber = (1 >> maxLengthInBits) | toAdd;
to |= filledNumber << startPosition;
return to;
}
然后我这样称呼它来编码所有值:
private static long CalculateMaxBinary(int a, int b, int c, int d, int e, int f, int g, int h, int i)
{
long result = 0;
result = AddBitwise(result, a, 52, 12);
result = AddBitwise(result, b, 47, 5);
result = AddBitwise(result, c, 41, 6);
result = AddBitwise(result, d, 35, 6);
result = AddBitwise(result, e, 28, 7);
result = AddBitwise(result, f, 23, 5);
result = AddBitwise(result, g, 17, 6);
result = AddBitwise(result, h, 9, 8);
result = AddBitwise(result, i, 1, 8);
return result;
}
但是我必须做错事或采取完全错误的方法,有人可以告诉我如何将指定位置的特定固定位数设置为数字的示例吗?
【问题讨论】:
-
不得不指出DateTime是一个无符号的64位值。解码为already provided in the class
-
是的,但是我只需要对 DateTime 的一部分进行编码(例如,没有秒数和最多到 2048 年的年份),并且我需要对与 DateTime 无关的其他值进行编码
-
1 >> maxLengthInBits-- 这是什么意思? -
@LadislavBohm 为什么?您最终只会得到一个缓慢且容易出错的类,它可能比简单地使用您想要的字段创建一个结构需要更多的内存。那是因为所有这些编码/解码都比简单地访问字段要慢得多。生成的临时值会造成内存浪费。
-
@PanagiotisKanavos 我在 Christopher 的回答下在评论中说明了我的原因。
标签: c# bit-manipulation encode bitwise-operators bit-shift