Разбор ulong в две переменные uint в c # - PullRequest
4 голосов
/ 25 декабря 2011

У меня есть серия ulong экземпляров, каждый из которых содержит два отдельных значения.Первые 4 байта представляют одно значение uint, а вторые 4 байта представляют другое.Каков наиболее эффективный способ разбора ulong на две uint переменные?Это будет происходить в тесных циклах, поэтому я ищу самый быстрый шаблон.

Ответы [ 2 ]

9 голосов
/ 25 декабря 2011

Два варианта:

  • используйте unsafe код или злоупотребление явный макет struct (как объединение), чтобы тихо разорвать его на куски
  • использовать сменные операции

Обычно я предпочел бы последнее; т.е.

uint x = (uint)(value & 0xFFFFFFFF), y = (uint)((value >> 32)&0xFFFFFFFF)

В дополнение к работе в большем количестве сред (не все виртуальные машины допускают unsafe), это позволяет избежать риска путаницы на машине с другим порядком байтов (возможно, с использованием Mono).

Версия unsafe будет выглядеть примерно так:

uint* ptr = (uint*)(void*)&value;
uint x = ptr[0], y = ptr[1];

Для чего быстрее: попробуйте оба варианта и время t! Микрооптимизация может быть оценена только в определенном кодовом контексте.

3 голосов
/ 25 декабря 2011

Вы также можете явно расположить структуру с перекрывающимися полями (что похоже на объединение в Си).

[StructLayout(LayoutKind.Explicit)]
struct SplitStruct
{
 [FieldOffset(0)]
 public ulong ulongValue;

 [FieldOffset(0)]
 public uint uintValue1;

 [FieldOffset(4)]
 public unit uintValue2;
}

Хотя лично я все еще использовал бы сдвиг битов.Четко изложенная структура скрывает то, что происходит, и довольно неясна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...