Как вписать структуру в int64? - PullRequest
0 голосов
/ 15 августа 2010

Мне нужно вписать следующую структуру в 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?Все элементы являются числовыми и имеют указанный битовый размер

Ответы [ 3 ]

7 голосов
/ 15 августа 2010

Только поразрядно - или компоненты вместе с соответствующими сдвигами.

int64 combined = random | (hostname << 18) | (seconds << (18+12)) ... etc.

Получите вещи, сдвигая и вставляя их.

random = combined & 0x3FFFF
hostname = (combined >> 18) & 0xFFF;
etc.
7 голосов
/ 15 августа 2010

Как правило, вы объявляете структуру с одним полем int64 и несколькими свойствами, которые обращаются только к соответствующим битам этого поля.

Например:

struct MyStruct
{
    int64 _data

    public short Day
    {
        get { return (short)(_data >> 57); }
    }
}
4 голосов
/ 15 августа 2010

Вы пометили эти 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 # вам придется сдвигать себя, как в других ответах.

...