Объедините 2 целых числа и сохраните их в ulong - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть Dictionary<int,ulong>, где я хочу хранить StudentId и его / ее зарегистрированный courses (который гарантированно равен 2).

Теперь, как вы можете видеть, вместо сохранения двух курсов в List целых чисел, я хочу сохранить их как ulong, поскольку ulong занимают 64 бита и int занимают 32 бита.

Итак, мой вопрос: как мне объединить эти 2 целочисленных идентификатора и сохранить их в переменной ulong. Я пытался с какой-то побитовой операцией и сдвигом, но не смог понять это.

1 Ответ

0 голосов
/ 27 апреля 2018

«Упаковка» данных двух int с в 64 бита может быть выполнена без ulong, например, так:

Dictionary<int,ValueTuple<int,int>>

ValueTuple<int,int> занимает ровно столько же места, сколько ulong, но позволяет вам получить доступ к отдельным int s через его свойства.

Если вы должны использовать ulong, вот один подход, который позволяет упаковывать и распаковывать int s:

private static ulong Combine(int a, int b) {
    uint ua = (uint)a;
    ulong ub = (uint)b;
    return ub <<32 | ua;
}
private static void Decombine(ulong c, out int a, out int b) {
    a = (int)(c & 0xFFFFFFFFUL);
    b = (int)(c >> 32);
}

Демо.

...