我有一个快速的位级例程来计算一个值,并返回UINT32。我需要将此值存储在32位int字段中。我不想增加字段的大小,只想存储此函数int字段的“字节”。

一次要求其中数百个记录,因此我需要最快的方法将UINT32转换为循环中的INT。如果在UINT32中设置了最左侧的位,则应设置INT的符号(或者执行“可重复”的任何操作,但符号位可能最容易)。

换句话说,我只希望uint32的4个字节成为32位int的4个字节。我可以使用BitConverter类,但我不确定这是最快的方法。这样做的速度会更快地使用像这样的未经检查的区域:

UInt32 fld = 4292515959;
unchecked {
    return (int)fld;
    // -2451337
}

我看到相反的问题在这里被问到,只是想知道答案是否会以相同的方式进行:

将int施放到uint32位的最快方法?

有帮助吗?

解决方案

我会说未选中的版本(就像 unchecked((int)x))是最快的方法,因为没有方法调用。我不相信有更快的方法。

顺便一提, UInt32 只是另一个名字 uint...采取一种方式与性能方面的另一种方式相同,因此这与您发布的链接确实相同。


编辑:我记得亲眼观察基准的实例 checked 曾是 快点unchecked (不,这不是调试构建,它是具有优化的发行版本)。我不知道为什么会发生这种情况,但是无论如何,都不认为您会通过转动溢出检查而获得任何可衡量的东西。

其他提示

unchecked((int)x) 仅需要施放常量并检查和未检查的结果(如果代码可以编译)会产生相同的结果。

例如此代码

uint data = 4292515959;
int uncheckedData;
int checkedData;
unchecked {
    uncheckedData = (int)data;
}
checkedData = (int)data;

Console.WriteLine(data);
Console.WriteLine(uncheckedData);
Console.WriteLine(checkedData);

产生此输出

4292515959
-2451337
-2451337

更简洁,可以编译此代码(结果与 unchecked((int)data))

uint data = 4292515959;
checkedData = (int)data;

该代码(注意const)无法编译(不需要任何选中)

const uint data = 4292515959;
checkedData = (int)data;

也不能编译此代码(需要未经检查)

checkedData = (int)4292515959;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top