我需要将以下结构放入 int64 中。
day 9 bit (0 to 372)
year 8 bit (2266-2010 = 256 y)
seconds 17 bit (24*60*60=86400 s)
hostname 12 bit (2^12=4096)
random 18 bit (2^18=262144)
如何使这样的结构适合 int64?所有项目都是数字的,并且具有指定的位大小
我需要将以下结构放入 int64 中。
day 9 bit (0 to 372)
year 8 bit (2266-2010 = 256 y)
seconds 17 bit (24*60*60=86400 s)
hostname 12 bit (2^12=4096)
random 18 bit (2^18=262144)
如何使这样的结构适合 int64?所有项目都是数字的,并且具有指定的位大小
通常,您会声明一个具有一个 int64 字段的结构,以及仅访问该字段的相关位的多个属性。
就像:
struct MyStruct
{
int64 _data
public short Day
{
get { return (short)(_data >> 57); }
}
}
只是按位或将组件与适当的移位一起。
int64 combined = random | (hostname << 18) | (seconds << (18+12)) ... etc.
通过移动和和-ing来解决问题。
random = combined & 0x3FFFF
hostname = (combined >> 18) & 0xFFF;
etc.
您标记了这个 C++ 和 C#,这两个选项非常不同。
在 C++ 中,您可以使用位域:
// from MSDN
struct Date
{
unsigned nWeekDay : 3; // 0..7 (3 bits)
unsigned nMonthDay : 6; // 0..31 (6 bits)
unsigned nMonth : 5; // 0..12 (5 bits)
unsigned nYear : 8; // 0..100 (8 bits)
};
在 C# 中,您将不得不自己移位,就像在其他答案中一样。