我写了一个Int128类型,效果很好。我认为我可以通过一个简单的想法改进其性能:改进有点笨拙的换档操作。
因为它们在乘法和除法中被大量使用,所以改进会产生连锁反应。所以我开始创建一个动态方法(向低位移动并旋转高位),只发现没有OpCodes.Rol或OpCodes.Ror指令。
这可能在IL吗?
答案 0 :(得分:4)
没有
您需要使用位移
来实现它UInt64 highBits = 0;
UInt64 lowBits = 1;
Int32 n = 63;
var altShift = (n - 63);
var lowShiftedOff = (n - 63) > 0 ? 0 : (lowBits << n);
var highShiftedOff = (n - 63) > 0 ? 0 : (highBits << n);
var highResult = (UInt64)(highShiftedOff | (altShift > 0 ? (lowBits << altShift - 1) : 0));
var lowResult= (UInt64)(lowShiftedOff | (altShift > 0 ? (highBits << altShift - 1) : 0));
答案 1 :(得分:2)
7年后部分回答这个问题,万一有人需要它。
您可以在.Net中使用ROR / ROL。
MSIL不直接包含ROR或ROL操作,但有些模式会使JIT编译器生成ROR和ROL。 RuyJIT(.Net和.Net核心)支持这一点。
使用此模式改进.Net Core的详细信息为discussed here,一个月后.Net核心代码为updated to use it。
查看implementation of SHA512我们找到了ROR的例子:
public static UInt64 RotateRight(UInt64 x, int n) {
return (((x) >> (n)) | ((x) << (64-(n))));
}
并以相同的模式扩展到ROL:
public static UInt64 RotateLeft(UInt64 x, int n) {
return (((x) << (n)) | ((x) >> (64-(n))));
}
要在128位整数上执行此操作,您可以将其作为两个64位进行处理,然后按AND以提取&#34;进行&#34;,AND以清除目标和要应用的OR。这必须在两个方向上镜像(低 - >高和高 - >低)。因为这个问题有点陈旧,所以我不打扰一个例子。