2011-12-25 5 views
3

私は一連のulongインスタンスを持っていますが、それぞれに2つの値が含まれています。最初の4バイトは1つのuint値を表し、2番目の4バイトは別の値を表します。 ulongを2つの変数uintに解析する最も効率的な方法は何ですか?タイトなループでこれが起こるので、私は可能な限り速いパターンを探しています。ulongをC言語の2つのuint変数に解析する

答えて

8

つのオプション:

  • 粉々にそれをリッピングするために使用unsafeコードまたは(組合など)乱用明示的なレイアウトstruct黙っ
  • 使用シフト演算

私は」 dは通常後者を好む。すなわち、(すべてのVMがunsafeを許可していない)、これは、異なるエンディアンのマシン上の混乱のリスク回避(モノを使用して、おそらく)より環境で作業することに加えて

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

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

が高速です:オプションと時間tの両方で試してください

unsafeバージョンは何かのようになります!ミクロ最適化は、特定のコードコンテキストでのみ評価できます。

+0

+1 32のシフトと0xffffffffのマスクを除いて – kenny

+0

@kenny odd;私の心は "ushort"と思っていました - ta –

+0

ありがとう...私は3つのバリエーションをテストしました。 (** 1 **)マネージドシフト[*上記*]、(** 2 **)安全でないシフト[*上記も*]、および(** 3 **)BitConverterバリエーション。私のテストでは、Managedシフトの変動は最も速いことが示されています(* 2から3 *)。ありがとう、私はオプション** 1 **で行くつもりです。 – JoeGeeky

3

また、重複するフィールド(C共用体のようなもの)を持つ構造体を明示的にレイアウトすることもできます。

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

[FieldOffset(0)] 
public uint uintValue1; 

[FieldOffset(4)] 
public unit uintValue2; 
} 

私はまだビットシフトを使用しますが、明示的にレイアウトされた構造体は、何が起こっているかを隠し、かなり不明瞭です。

+0

私はこれに言及しましたが、完全な例としてこれを持つ価値は間違いありません - 良い追加 –

関連する問題