C函数
unsigned long int ROTL(unsigned long int x, unsigned long int y)
{
return ((x) << (y&(32 - 1))) | ((x) >> (32 - (y&(32 - 1))));
}
C#中的功能
uint ROTL(uint x, uint y)
{
return ((x) << (int)(y & (32 - 1))) | ((x) >> (int)(32- (y & (32 - 1))));
}
对于较小的数字,上述功能可以完成相同的工作,并获得相同的结果, 但是当我传递大量数字时,C#中的结果不同于C。
转换或函数本身是否有问题?我也尝试使用
进行转换Convert.ToInt32()
答案 0 :(得分:0)
假设unsigned long int
转换为您想与C#ulong
而不是uint
一起使用的无符号64位整数。
主要问题在于,y参数没有强制转换为int
,因为无论如何它只占用最后5位。但是,当x的类型为uint
时,(最坏的情况)31个位的移位远远超过了其限制。
强制转换并将其返回到ulong
即可解决问题。
ulong ROTL(uint x, uint y)
{
return (((ulong)x) << (int)(y & (32 - 1))) | (((ulong)x) >> (int)(32 - (y & (32 - 1))));
}
请注意,我没有对此进行全面测试,仅进行了一些边界测试:https://dotnetfiddle.net/0ETAEL
编辑:当您期望结果大于2 ^ 64(或作为参数值:ROTL(uint.MaxValue, 31)
)时,您应该考虑看看BigInteger。