【发布时间】:2012-12-07 05:35:31
【问题描述】:
我刚刚了解到decimal 数据类型在 .NET 中用 128 位表示
是否可以在 decimal 上进行按位运算,这会比在 2 ulong 上进行运算更快/更慢吗?
【问题讨论】:
-
你为什么要这样做?对两个 ulong 进行按位运算是有道理的,但对小数来说,就没那么多了。
标签: .net bit-manipulation decimal 128-bit
我刚刚了解到decimal 数据类型在 .NET 中用 128 位表示
是否可以在 decimal 上进行按位运算,这会比在 2 ulong 上进行运算更快/更慢吗?
【问题讨论】:
标签: .net bit-manipulation decimal 128-bit
不,你不能。首先,decimal is a floating-point type with base 10,不是 128 位整数。你不能对浮点类型进行按位运算
其次,没有 128 位架构,因此即使您设法在 C# 中使用 128 位整数类型,它也不会比操作 2 个 ulong 变量快,因为您仍然必须打破将 128 位值分成适合寄存器的较小部分
也就是说,大多数现代 PC 架构都支持SIMD,因此可以在 128 位类型上进行快速的按位运算。在本机代码中非常容易,但我不确定您是否可以在 C# 中做到这一点。如果没有,那么您必须编写一个本机代码库并从 C# 中调用它。
尽管如此,在 C# 中,BitArray class可能在后台使用 SIMD,因此请尝试创建一个 128 位 BitArray 并查看
在 Mono 中,SIMD support 和 Mono.Simd namespace 早已存在。后来微软开发 RyuJit 时,他们为此引入了Microsoft.Bcl.Simd。它现在已重命名为System.Numerics,其中包括
支持 SIMD 的向量类型,包括 Vector2、Vector3、Vector4、Matrix3x2、Matrix4x4、Plane 和 Quaternion。
Mono 现在也是supports the official System.Numerics namespace。不幸的是,目前该命名空间中的许多类型都不支持按位运算,因此您可能需要使用普通的算术运算来解决这个问题。但是Vector<T> struct 确实有BitwiseAnd、BitwiseOr、ExclusiveOr...
更多信息请阅读
System.Numerics.Vector for Graphics Programming【讨论】: