私は一連のulong
インスタンスを持っていますが、それぞれに2つの値が含まれています。最初の4バイトは1つのuint
値を表し、2番目の4バイトは別の値を表します。 ulong
を2つの変数uint
に解析する最も効率的な方法は何ですか?タイトなループでこれが起こるので、私は可能な限り速いパターンを探しています。ulongをC言語の2つのuint変数に解析する
3
A
答えて
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
バージョンは何かのようになります!ミクロ最適化は、特定のコードコンテキストでのみ評価できます。
3
また、重複するフィールド(C共用体のようなもの)を持つ構造体を明示的にレイアウトすることもできます。
[StructLayout(LayoutKind.Explicit)]
struct SplitStruct
{
[FieldOffset(0)]
public ulong ulongValue;
[FieldOffset(0)]
public uint uintValue1;
[FieldOffset(4)]
public unit uintValue2;
}
私はまだビットシフトを使用しますが、明示的にレイアウトされた構造体は、何が起こっているかを隠し、かなり不明瞭です。
+0
私はこれに言及しましたが、完全な例としてこれを持つ価値は間違いありません - 良い追加 –
関連する問題
- 1. スクリプト言語でC#を解析する
- 2. 2つのuintをcのulongに結合する最良の方法は何ですか#
- 3. C言語の解析ファイルの詳細
- 4. C言語でulongからlongにビットをコピーする
- 5. C言語の意味解析
- 6. アセンブリ言語の解析Regex
- 7. 言語フラグメントの解析
- 8. 自然言語の解析
- 9. C言語の文字列を個々の単語に解析する
- 10. C言語の2つの関数でpthreadを使用する
- 11. 文字列関数を使用してC言語のxmlを解析する
- 12. 複数言語のフィードを解析するためのベストプラクティス
- 13. 2回同じ変数宣言を解析するコード
- 14. 16進数値を解析してuintに変換する方法は?
- 15. スワップScalaの言語による2つの変数
- 16. MiniXML:C言語でxmlを解析する
- 17. エラーメッセージC言語での変数宣言
- 18. Sconsのビルドスクリプトを解剖するPython言語を "解析する"?
- 19. 2つの関数をC言語で1つに連結する
- 20. C言語の変数と関数
- 21. 現在の日付と時刻をC言語で2つの異なる変数に変換する
- 22. ログ解析用のLinux言語/ツール
- 23. Constituency Treeの構文解析ツール(言語解析API)
- 24. 1つのステートメントで2つのダブル値を解析する - C#
- 25. C言語での可変引数関数呼び出しのJson文字列の解析
- 26. C言語のchar変数の値
- 27. C言語でのextern変数のリンク
- 28. 現在の言語に応じてxmlファイルを解析する
- 29. 変数をC言語のライブラリスコープにグローバルに保持する
- 30. C言語のユーザー入力変数値
+1 32のシフトと0xffffffffのマスクを除いて – kenny
@kenny odd;私の心は "ushort"と思っていました - ta –
ありがとう...私は3つのバリエーションをテストしました。 (** 1 **)マネージドシフト[*上記*]、(** 2 **)安全でないシフト[*上記も*]、および(** 3 **)BitConverterバリエーション。私のテストでは、Managedシフトの変動は最も速いことが示されています(* 2から3 *)。ありがとう、私はオプション** 1 **で行くつもりです。 – JoeGeeky