decimal
.NET ではデータ型が 128 ビットで表されることを知りました。
でビット単位の操作を行うことは可能ですか? decimal
2 で操作を行うよりも速く/遅くなりulong
ますか?
decimal
.NET ではデータ型が 128 ビットで表されることを知りました。
でビット単位の操作を行うことは可能ですか? decimal
2 で操作を行うよりも速く/遅くなりulong
ますか?
いいえ、できません。まず、128 ビット整数ではなく、decimal
基数 10 の浮動小数点型です。浮動小数点型に対してビット単位の演算を行うことはできません
第 2 に、128 ビットのアーキテクチャは存在しないため、C# で 128 ビットの整数型を使用できたulong
としても、128 ビットの値をより小さな値に分割する必要があるため、2 つの変数を操作するよりも決して高速ではありません。レジスターに収まる部分
とはいえ、最新の PC アーキテクチャのほとんどはSIMDをサポートしているため、128 ビット型で高速なビット演算を行うことができます。ネイティブ コードでは非常に簡単ですが、C# でそれができるかどうかはわかりません。そうでない場合は、ネイティブ コード ライブラリを作成し、C# から呼び出す必要があります。
それにもかかわらず、C# には内部で SIMD を使用する可能性のあるBitArray クラスがあるため、128 ビットの BitArray を作成してみてください。
Mono では、名前空間でのSIMD サポートが長い間行われてきました。その後、Microsoft が RyuJit を開発したときに、この目的のために導入されました。に名前が変更されました。Mono.Simd
Microsoft.Bcl.Simd
System.Numerics
Vector2、Vector3、Vector4、Matrix3x2、Matrix4x4、Plane、およびQuaternionを含む SIMD 対応のベクトル型。
Monoは公式のSystem.Numerics
名前空間もサポートするようになりました。残念ながら、現在、その名前空間の多くの型はビット演算をサポートしていないため、通常の算術演算を使用して回避する必要がある場合があります。しかし、Vector<T>
構造体にはBitwiseAnd
, BitwiseOr
, ExclusiveOr
...があります
詳細については、こちらをお読みください