如何将 ulong 转换为正整数?
How can I convert a ulong to an positive int?
我有一段代码是
// Bernstein hash
// http://www.eternallyconfuzzled.com/tuts/algorithms/jsw_tut_hashing.aspx
ulong result = (ulong)s[0];
for ( int i = 1; i < s.Length; ++i )
{
result = 33 * result + (ulong)s[i];
}
return (int)result % Buckets.Count;
问题是它有时会返回负值。我知道原因是因为 (int)result
可以是负数。但我想将它强制为非负数,因为它被用作索引。现在我意识到我可以做到
int k = (int)result % Buckets.Count;
k = k < 0 ? k*-1 : k;
return k;
但是有更好的方法吗?
在更深层次上,为什么int
用于C#中容器的索引?我来自 C++ 背景,我们有 size_t
这是一个无符号整数类型。这对我来说更有意义。
使用
return (int)(result % (ulong)Buckets.Count);
当您对值求和时,您得到一个正整数,该整数不能表示为带符号的 32 位整数中的正数。转换为 int 将 return 为负数。然后模运算也会 return 一个负数。如果您先进行模运算,您将得到一个较低的正数并且转换为 int 不会有任何坏处。
虽然您可以找到一种方法将其正确转换为 int
,但我想知道您为什么不从一开始就将其计算为 int
。
int result = (int)s[0]; // or, if s[0] is already an int, omit the cast
for ( int i = 1; i < s.Length; ++i )
{
result = 33 * result + (int)s[i];
}
return Math.Abs(result) % Buckets.Count;
至于为什么 C# 使用带符号的 int
作为索引,它 has to do with cross-language compatibility.
我有一段代码是
// Bernstein hash
// http://www.eternallyconfuzzled.com/tuts/algorithms/jsw_tut_hashing.aspx
ulong result = (ulong)s[0];
for ( int i = 1; i < s.Length; ++i )
{
result = 33 * result + (ulong)s[i];
}
return (int)result % Buckets.Count;
问题是它有时会返回负值。我知道原因是因为 (int)result
可以是负数。但我想将它强制为非负数,因为它被用作索引。现在我意识到我可以做到
int k = (int)result % Buckets.Count;
k = k < 0 ? k*-1 : k;
return k;
但是有更好的方法吗?
在更深层次上,为什么int
用于C#中容器的索引?我来自 C++ 背景,我们有 size_t
这是一个无符号整数类型。这对我来说更有意义。
使用
return (int)(result % (ulong)Buckets.Count);
当您对值求和时,您得到一个正整数,该整数不能表示为带符号的 32 位整数中的正数。转换为 int 将 return 为负数。然后模运算也会 return 一个负数。如果您先进行模运算,您将得到一个较低的正数并且转换为 int 不会有任何坏处。
虽然您可以找到一种方法将其正确转换为 int
,但我想知道您为什么不从一开始就将其计算为 int
。
int result = (int)s[0]; // or, if s[0] is already an int, omit the cast
for ( int i = 1; i < s.Length; ++i )
{
result = 33 * result + (int)s[i];
}
return Math.Abs(result) % Buckets.Count;
至于为什么 C# 使用带符号的 int
作为索引,它 has to do with cross-language compatibility.